CSV-Files splitten

CSV-Files splitten

am 02.05.2006 23:06:39 von j-w-b

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

am 02.05.2006 23:37:11 von Slaven Rezic

"Joachim Böcker" 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 rezic de

Tk-AppMaster: a perl/Tk module launcher designed for handhelds
http://tk-appmaster.sf.net

Re: CSV-Files splitten

am 03.05.2006 00:08:29 von j-w-b

"Slaven Rezic" schrieb im Newsbeitrag
news:873bfsrtvc.fsf@vran.herceg.de...
> "Joachim Böcker" 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 rezic de
>
> Tk-AppMaster: a perl/Tk module launcher designed for handhelds
> http://tk-appmaster.sf.net

Re: CSV-Files splitten

am 03.05.2006 00:24:18 von Dominik Seelow

Joachim Böcker wrote:
> "Slaven Rezic" 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

am 03.05.2006 00:35:39 von j-w-b

"Dominik Seelow" schrieb im Newsbeitrag
news:4457DC12.1010406@kamelfarm.fqdn...
> Joachim Böcker wrote:
>> "Slaven Rezic" 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 @INC (@INC contains:
C:/Programme/perl/lib C:/Programme/perl/site/lib
.) at C:/Programme/perl/lib/AutoLoader.pm line 146.

Re: CSV-Files splitten

am 03.05.2006 00:46:22 von Achim Grolms

"Joachim B?cker" wrote:
> "Dominik Seelow" schrieb im Newsbeitrag
> news:4457DC12.1010406@kamelfarm.fqdn...
>> Joachim Böcker wrote:
>>> "Slaven Rezic" 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

am 03.05.2006 10:32:16 von Ferry Bolhar

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

Re: CSV-Files splitten

am 03.05.2006 10:42:16 von j-w-b

>>>>> 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

am 03.05.2006 11:13:05 von Frank Seitz

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

am 03.05.2006 11:22:34 von news.5.maazl

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

Re: CSV-Files splitten

am 03.05.2006 12:27:50 von ReneeB

Auch auf Webspace kann man Module installieren:
http://sourceforge.net/projects/cgipan/

Re: CSV-Files splitten

am 04.05.2006 02:15:58 von Slaven Rezic

"Joachim Böcker" 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 rezic de

Tk-AppMaster: a perl/Tk module launcher designed for handhelds
http://tk-appmaster.sf.net

Re: CSV-Files splitten

am 06.05.2006 13:37:18 von 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!

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";

Re: CSV-Files splitten

am 06.05.2006 19:51:11 von Achim Grolms

Michael Perle 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:
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

am 08.05.2006 18:09:17 von Ralf Muschall

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

Re: CSV-Files splitten

am 09.05.2006 00:13:16 von Achim Grolms

Ralf Muschall 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
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

am 09.05.2006 00:21:06 von hjp-usenet2

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