CSV-Files splitten
am 02.05.2006 23:06:39 von j-w-bHallo NG,
hat jemand ein Script um CSV-Files (mit Semikolon) zu splitten? Bitte keine
Hinweise auf Module, die stehen mir auf meinem Webspace nicht zur Verfügung!
Danke
Joachim
Hallo NG,
hat jemand ein Script um CSV-Files (mit Semikolon) zu splitten? Bitte keine
Hinweise auf Module, die stehen mir auf meinem Webspace nicht zur Verfügung!
Danke
Joachim
"Joachim Böcker"
> Hallo NG,
>
> hat jemand ein Script um CSV-Files (mit Semikolon) zu splitten? Bitte keine
> Hinweise auf Module, die stehen mir auf meinem Webspace nicht zur Verfügung!
>
Text::CSV ist pure perl. Ansonsten könnte, je nach Existenz von
Quoting und Escaping, ein einfaches split() funktionieren.
--
Slaven Rezic - slaven
Tk-AppMaster: a perl/Tk module launcher designed for handhelds
http://tk-appmaster.sf.net
"Slaven Rezic"
news:873bfsrtvc.fsf@vran.herceg.de...
> "Joachim Böcker"
>
>> Hallo NG,
>>
>> hat jemand ein Script um CSV-Files (mit Semikolon) zu splitten? Bitte
>> keine
>> Hinweise auf Module, die stehen mir auf meinem Webspace nicht zur
>> Verfügung!
>>
>
> Text::CSV ist pure perl. Ansonsten könnte, je nach Existenz von
> Quoting und Escaping, ein einfaches split() funktionieren.
>
Hab ich schon probiert, arbeitet aber nicht mit Semikolons sondern nur mit
Kommas!
> --
> Slaven Rezic - slaven
>
> Tk-AppMaster: a perl/Tk module launcher designed for handhelds
> http://tk-appmaster.sf.net
Joachim Böcker wrote:
> "Slaven Rezic"
>> Text::CSV ist pure perl. Ansonsten könnte, je nach Existenz von
>> Quoting und Escaping, ein einfaches split() funktionieren.
>
> Hab ich schon probiert, arbeitet aber nicht mit Semikolons sondern nur mit
> Kommas!
Hä?
$_="a;b;c;d";
print join (",",split /;/);
Viele Grüße,
Dominik
"Dominik Seelow"
news:4457DC12.1010406@kamelfarm.fqdn...
> Joachim Böcker wrote:
>> "Slaven Rezic"
>
>>> Text::CSV ist pure perl. Ansonsten könnte, je nach Existenz von
>>> Quoting und Escaping, ein einfaches split() funktionieren.
>>
>> Hab ich schon probiert, arbeitet aber nicht mit Semikolons sondern nur
>> mit Kommas!
>
> Hä?
>
> $_="a;b;c;d";
> print join (",",split /;/);
>
Sorry, meine das Modul Text::CSV!
Aber habe gerade gemerkt das dieses doch nicht so einfach läuft, bekomme den
Fehler:
Uncaught exception from user code:
Can't locate auto/Text/CSV/autosplit.ix in @INC (@INC contains:
C:/Programme/perl/lib C:/Programme/perl/site/lib
.) at C:/Programme/perl/lib/AutoLoader.pm line 146.
"Joachim B?cker"
> "Dominik Seelow"
> news:4457DC12.1010406@kamelfarm.fqdn...
>> Joachim Böcker wrote:
>>> "Slaven Rezic"
>>
>>>> Text::CSV ist pure perl. Ansonsten könnte, je nach Existenz von
>>>> Quoting und Escaping, ein einfaches split() funktionieren.
>>>
>>> Hab ich schon probiert, arbeitet aber nicht mit Semikolons sondern nur
>>> mit Kommas!
>>
>> Hä?
>>
>> $_="a;b;c;d";
>> print join (",",split /;/);
>>
> Sorry, meine das Modul Text::CSV!
Schau Dir mal Text::CSV_PP vom CPAN an.
Joachim Böcker:
> hat jemand ein Script um CSV-Files (mit Semikolon) zu splitten? Bitte
keine
> Hinweise auf Module, die stehen mir auf meinem Webspace nicht zur
Verfügung!
perldoc -f split
LG, Ferry
--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at
>>>>> Text::CSV ist pure perl.
Anscheinend doch nicht, muss erst installiert werden damit es funktioniert!
Das kann ich dann auch nicht verwenden weil nicht auf meinem Webspace
verfügbar!
Es müsste doch in Perl mit einem Regulären Ausdruck möglich sein eine
CSV-Zeile zu splitten ohne Semikolons die in Anführungszeichen stehen!
Mein Problem ist sowas: "text";0.00;"tex;t";
Also wenn ein Semikolon im Text steht, dann bringt mir split(/;/, $row)
nicht viel!
Danke
Joachim
Joachim Böcker wrote:
>
> Anscheinend doch nicht, muss erst installiert werden damit es funktioniert!
> Das kann ich dann auch nicht verwenden weil nicht auf meinem Webspace
> verfügbar!
Verstehe ich nicht. Wenn Du CGI-Programme hochladen kannst,
solltest Du auch Perl-Moduldateien in Deinem Webspace
verfügbar machen können.
> Es müsste doch in Perl mit einem Regulären Ausdruck möglich sein eine
> CSV-Zeile zu splitten ohne Semikolons die in Anführungszeichen stehen!
>
> Mein Problem ist sowas: "text";0.00;"tex;t";
> Also wenn ein Semikolon im Text steht, dann bringt mir split(/;/, $row)
> nicht viel!
Oder versuchs mal damit: http://kuerzer.de/parse_csv
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Joachim Böcker schrieb:
> hat jemand ein Script um CSV-Files (mit Semikolon) zu splitten? Bitte keine
> Hinweise auf Module, die stehen mir auf meinem Webspace nicht zur Verfügung!
Da! Es ist aber für Tabs.
Ersetze \t durch ; und es geht auch mit Semikolon. STDIN muss ggf. durch
das gewünschte Filehandle ersetzt werden.
Das Perlfragment kann sogar mit Newlines und Anführungszeichen im
Zelleninhalt umgehen. Kurzum es können (korrekte Exportfunktion
vorausgesetzt) auch binäre Zelleninhalte transportiert werden.
while (
my @data = split /\t/, $_, -1;
my $i;
while ($i <= $#data)
{ if ($data[$i] =~ s/^"//)
{ # quoted item
$data[$i] =~ s/""/"/g;
while ($data[$i] !~ s/"$//) # ende der quote
{ if ($i < $#data)
{ $data[$i] .= "\t";
} else
{ while ($i >= $#data)
{ # keine weiteren items -> nächste Zeile lesen
eof STDIN and die "Unexpected end of file in quoted
item.\n";
$data[$i] .= "\n";
my $l =
chomp $l;
push @data, split /\t/, $l, -1;
} }
# nächstes Item anhängen
$data[$i+1] =~ s/""/"/g;
$data[$i] .= splice @data, $i+1, 1;
}
}
} continue
{ ++$i;
}
# mach was mit @data .....
}
Marcel
Auch auf Webspace kann man Module installieren:
http://sourceforge.net/projects/cgipan/
"Joachim Böcker"
> >>>>> Text::CSV ist pure perl.
> Anscheinend doch nicht, muss erst installiert werden damit es funktioniert!
> Das kann ich dann auch nicht verwenden weil nicht auf meinem Webspace
> verfügbar!
Der einzige Grund, warum Text::CSV eine "Installation" braucht, ist
die Verwendung von Autoloader und Autosplit. Das kann man leicht
umgehen, indem man einfach "__END__" im Modulcode entfernt.
Ansonsten kann man sich einiger Codefragemente des Moduls bedienen.
Gruß,
Slaven
--
Slaven Rezic - slaven
Tk-AppMaster: a perl/Tk module launcher designed for handhelds
http://tk-appmaster.sf.net
Joachim Böcker wrote:
> hat jemand ein Script um CSV-Files (mit Semikolon) zu splitten? Bitte keine
> Hinweise auf Module, die stehen mir auf meinem Webspace nicht zur Verfügung!
Wenn (falls) Du weißt, welche Besonderheiten
auf Dich zukommen können, d.h. wie das Dateiformat
spezifiziert ist, dann schreibe es doch grad
selbst.
Für minimale Anforderungen kann das sowas wie das
Skript unter meiner Signatur sein. Die dritte
Zeile wird falsch ausgegeben, weil der Fall, dass
ein Wert ein Semikolon enthällt in _meiner_ Spec
nicht vorkommt.
MP
while () {
chomp;
my @werte = split/;/;
map { s/^"(.*?)"$/$1/ } @werte;
print "Werte: ", join(" UND ", @werte), "\n";
}
__DATA__
1;2;"drei mit paar woertern";vier
"a und b";c;"d"
"Das hier geht nicht wegen; Semikolon";
Michael Perle
> Joachim Böcker wrote:
>> hat jemand ein Script um CSV-Files (mit Semikolon) zu splitten? Bitte keine
>> Hinweise auf Module, die stehen mir auf meinem Webspace nicht zur Verfügung!
> Die dritte
> Zeile wird falsch ausgegeben, weil der Fall, dass
> ein Wert ein Semikolon enthällt in _meiner_ Spec
> nicht vorkommt.
In Message-ID:
wird aber genau dieser Fall vom OP gefordert:
| Mein Problem ist sowas: "text";0.00;"tex;t";
| Also wenn ein Semikolon im Text steht,
| dann bringt mir split(/;/, $row)
| nicht viel!
Achim Grolms wrote:
> In Message-ID:
> wird aber genau dieser Fall vom OP gefordert:
>
> | Mein Problem ist sowas: "text";0.00;"tex;t";
> | Also wenn ein Semikolon im Text steht,
> | dann bringt mir split(/;/, $row)
> | nicht viel!
Und marginal komplexere Lösungen vermutlich auch nicht - die
knallen dann an
"foo\";bar" ; "baz\"\\" ; "bam\\\";\""
(echte Semikolons durch Leerzeichen hervorgehoben).
Kann mal jemand die Pumpe rausholen und nachsehen, ob das
überhaupt noch regulär ist? Vermutlich braucht man einen
echten Parser.
Ralf
Ralf Muschall
> "foo\";bar" ; "baz\"\\" ; "bam\\\";\""
>
> (echte Semikolons durch Leerzeichen hervorgehoben).
>
> Kann mal jemand die Pumpe rausholen und nachsehen, ob das
^^^^^^^^^^^^^^^
Jetzt habe ich als Laie erst mal nachlesen müssen, was
Du da meinst. Es gibt also
laut
ein "Pumping-Lemma" mit der Eigenschaft
| Idee
|
| Das Pumping-Lemma ist eine Methode, um nachzuweisen,
| ob eine formale Sprache nicht regulär (Variante 1)
| bzw. nicht kontextfrei (Variante 2) ist. Es liefert
| für diesen Beweis eine notwendige Bedingung. So
| wird der Beweis dann als Widerspruchsbeweis geführt.
| Es wird angenommen, dass eine Sprache regulär oder
| kontextfrei sei. Diese Aussage wird mit Hilfe eines
| Pumping-Lemma zum Widerspruch geführt.
OK.
Wie würde man als Fachmann jetzt im vorliegenden Falle
vorgehen wenn man entscheiden will ob man mit einem RegEx
weiterkommt?
Ralf Muschall wrote:
> Achim Grolms wrote:
>> In Message-ID:
>> wird aber genau dieser Fall vom OP gefordert:
>>
>> | Mein Problem ist sowas: "text";0.00;"tex;t";
>> | Also wenn ein Semikolon im Text steht,
>> | dann bringt mir split(/;/, $row)
>> | nicht viel!
>
> Und marginal komplexere Lösungen vermutlich auch nicht - die
> knallen dann an
>
> "foo\";bar" ; "baz\"\\" ; "bam\\\";\""
>
> (echte Semikolons durch Leerzeichen hervorgehoben).
>
> Kann mal jemand die Pumpe rausholen und nachsehen, ob das
> überhaupt noch regulär ist?
Sollte es sein. Lex kann auch nur Regexps.
> Vermutlich braucht man einen echten Parser.
#!/usr/bin/perl
use warnings;
use strict;
while () {
chomp;
my @a;
while (/\G"((?:\\\\|\\"|[^"])*)"(?:\s*;\s*)?/g) {
my $v = $1;
$v =~ s/\\([\\"])/$1/g;
push @a, $v;
}
print((map {"<$_> "} @a), "\n");
}
__DATA__
"foo\";bar" ; "baz\"\\" ; "bam\\\";\""
Die Erweiterung um Felder ohne Anführungszeichen sei dem OP als
Ãbungsaufgabe überlassen :-)
hp
--
_ | Peter J. Holzer | Man könnte sich [die Diskussion] auch
|_|_) | Sysadmin WSR/LUGA | sparen, wenn man sie sich einfach sparen
| | | hjp@hjp.at | würde.
__/ | http://www.hjp.at/ | -- Ralph Angenendt in dang 2006-04-15