CSV-Files splitten
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
Re: CSV-Files splitten
"Joachim Böcker" <j-w-b [at] gmx.de> writes:
> 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 <at> rezic <dot> de
Tk-AppMaster: a perl/Tk module launcher designed for handhelds
http://tk-appmaster.sf.net
Re: CSV-Files splitten
"Slaven Rezic" <slaven [at] rezic.de> schrieb im Newsbeitrag
news:873bfsrtvc.fsf [at] vran.herceg.de...
> "Joachim Böcker" <j-w-b [at] gmx.de> writes:
>
>> 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 <at> rezic <dot> de
>
> Tk-AppMaster: a perl/Tk module launcher designed for handhelds
> http://tk-appmaster.sf.net
Re: CSV-Files splitten
Joachim Böcker wrote:
> "Slaven Rezic" <slaven [at] rezic.de> schrieb im Newsbeitrag
>> 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
Re: CSV-Files splitten
"Dominik Seelow" <kurzhalsflasche [at] yahoo.co.uk> schrieb im Newsbeitrag
news:4457DC12.1010406 [at] kamelfarm.fqdn...
> Joachim Böcker wrote:
>> "Slaven Rezic" <slaven [at] rezic.de> schrieb im Newsbeitrag
>
>>> 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 [at] INC ( [at] INC contains:
C:/Programme/perl/lib C:/Programme/perl/site/lib
.) at C:/Programme/perl/lib/AutoLoader.pm line 146.
Re: CSV-Files splitten
"Joachim B?cker" <j-w-b [at] gmx.de> wrote:
> "Dominik Seelow" <kurzhalsflasche [at] yahoo.co.uk> schrieb im Newsbeitrag
> news:4457DC12.1010406 [at] kamelfarm.fqdn...
>> Joachim Böcker wrote:
>>> "Slaven Rezic" <slaven [at] rezic.de> schrieb im Newsbeitrag
>>
>>>> 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.
Re: CSV-Files splitten
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 [at] adv.magwien.gv.at
Re: CSV-Files splitten
>>>>> 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
Re: CSV-Files splitten
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
Re: CSV-Files splitten
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 (<STDIN>)
my [at] 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 = <STDIN>;
chomp $l;
push [at] data, split /\t/, $l, -1;
} }
# nächstes Item anhängen
$data[$i+1] =~ s/""/"/g;
$data[$i] .= splice [at] data, $i+1, 1;
}
}
} continue
{ ++$i;
}
# mach was mit [at] data .....
}
Marcel
Re: CSV-Files splitten
Auch auf Webspace kann man Module installieren:
http://sourceforge.net/projects/cgipan/
Re: CSV-Files splitten
"Joachim Böcker" <j-w-b [at] gmx.de> writes:
> >>>>> 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 <at> rezic <dot> de
Tk-AppMaster: a perl/Tk module launcher designed for handhelds
http://tk-appmaster.sf.net
Re: CSV-Files splitten
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 (<DATA>) {
chomp;
my [at] werte = split/;/;
map { s/^"(.*?)"$/$1/ } [at] werte;
print "Werte: ", join(" UND ", [at] werte), "\n";
}
__DATA__
1;2;"drei mit paar woertern";vier
"a und b";c;"d"
"Das hier geht nicht wegen; Semikolon";
Re: CSV-Files splitten
Michael Perle <michael_perle [at] yahoo.com> wrote:
> 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: <e39qdh$73p$02$1 [at] news.t-online.com>
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!
Re: CSV-Files splitten
Achim Grolms wrote:
> In Message-ID: <e39qdh$73p$02$1 [at] news.t-online.com>
> 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
Re: CSV-Files splitten
Ralf Muschall <ralf [at] tecont.de> wrote:
> "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 <http://de.wikipedia.org/wiki/Pumping-Lemma>
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?
Re: CSV-Files splitten
Ralf Muschall wrote:
> Achim Grolms wrote:
>> In Message-ID: <e39qdh$73p$02$1 [at] news.t-online.com>
>> 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 (<DATA>) {
chomp;
my [at] a;
while (/\G"((?:\\\\|\\"|[^"])*)"(?:\s*;\s*)?/g) {
my $v = $1;
$v =~ s/\\([\\"])/$1/g;
push [at] a, $v;
}
print((map {"<$_> "} [at] 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 [at] hjp.at | würde.
__/ | http://www.hjp.at/ | -- Ralph Angenendt in dang 2006-04-15