suchen/ersetzen in csv-dateien/regulaere Ausdruecke
Joachim
- perl
0 steckl0 seth_not@home1 batooh0 Joachim
Hi,
vorneweg: meine Perlkenntnisse existieren nicht. Aber ich sitze am Mac und möchte mich bessern ;-)
Aus einem Vokabelprogramm meiner Tochter exportiere ich csv files. Diese möchte ich in Tabellen verwandeln (damit es die Lehrerin besser lesen kann). Leider gibts dann im csv sowas:
text;text;"mehrere; textschnippel";usw;
Ich suche nach einer Möglichkeit, dies zu ersetzen, bevor ich dann bei ";" splitte. Sowas geht natürlich nicht:
s/"(.+?)"/replace(';','',$1)/gs
Aber kann ich irgendwie innerhalb von $1 die ";" rausschmeissen?
Gruesse, Joachim
Hi,
text;text;"mehrere; textschnippel";usw;
Ich suche nach einer Möglichkeit, dies zu ersetzen, bevor ich dann bei ";" splitte. Sowas geht natürlich nicht:
s/"(.+?)"/replace(';','',$1)/gsAber kann ich irgendwie innerhalb von $1 die ";" rausschmeissen?
Du könntest den String erst mit " splitten und dann in jedem 2. Listenelement die Semikolons ersetzen.
mfG,
steckl
gudn tach!
alternativ zu steckls vorschlag:
#!/usr/bin/perl -w
use strict;
$_ = 'text;text;"mehrere; textschnippel";usw;';
my @splitted = split /(".+?"|.+?);/; # splitte zeile in bestandteile
@splitted = grep {/./} @splitted; # loesche leere zeilen
map {s/[;"]//g} @splitted; # loesche alle verbleibenden ; und "
map {print $_,"\n"} @splitted; # probe-ausgabe
prost
seth
Hallo.
Sowas geht natürlich nicht:
s/"(.+?)"/replace(';','',$1)/gs
Na ja, eigentlich geht das schon, es fehlt nur eine Kleinigkeit.
Gehen wir mal davon aus, du hättest eine Subroutine namens "replace", die in etwa so aussieht:
sub replace {
my ($this, $that, $str) = @_;
$str =~ s/\Q$this\E/\Q$that\E/g;
return $str;
}
Dann musst du lediglich noch das "e"-Flag bei deiner obenstehenden Ersetzung hinzufügen (d. h. /egs), damit der Ersetzungsteil als Perl-Code ausgeführt wird, und dann sollte das funktionieren.
Informationen zu den Flags findest du hier: http://de.selfhtml.org/perl/sprache/regexpr.htm#flags
Schöne Grüße.
Hi,
Dann musst du lediglich noch das "e"-Flag bei deiner obenstehenden Ersetzung hinzufügen
_sehr_ cool, das wars :-)
Auch den anderen Danke, aber obige Lösung kommt mir am meisten entgegen.
Gruesse, Joachim