Schrift
[thread]8222[/thread]

CSV Datei ohne CRLF parsen

Leser: 1


<< >> 5 Einträge, 1 Seite
rk-ger
 2006-08-08 00:04
#68683 #68683
User since
2006-08-07
45 Artikel
BenutzerIn
[default_avatar]
Hi,

ich bekomme CSV Dateien zur weiteren Verarbeitung. Leider sind die Datensätze nicht durch CR oder CRLF getrennt. Wenn ich die Datei einlese, landet alles in einer Zeile - der ersten. Die 'Zeile' kann sehr lang werden - auch 1 bis 2 MB sind möglich.

Die Datensätze selbst starten jeweils mit \\\\\XYZ\\\\\ und enden mit /////XYZ/////. Dann folgen die Daten in der Form Wert123:eigentlicher Wert. Leerzeichen sind nicht escaped. Nach jedem Wertepaar folgt ein | (Pipe). Dia Daten selbst können auch alle Arten von Sonderzeichen (,_-.;~\/ etc.) enthalten. Mein Ziel: Ich muss eine 'echte' CSV-Datei bauen (Wert Komma Wert Komma Wert...).

Ein Beispiel: '\\\\\XYZ\\\\\Wert100:D|Wert330:12345|Wert400:012345678970|Wert530:16|Wert545:02.08.2006|Wert760:0|Wert761:Hier steht 1 Wert|Wert800:Text1|Wert805:3782|Wert810:Text2|Wert811:Noch ein Wert|Wert820:Im Hafen 00|Wert821:D|Wert822:12345|Wert823:Deutschland|Wert853:XX|Wert854:1231329|Wert860:xxxxxxxxxxx|Wert861:Herr|Wert862:Max Muster|Wert863:Ja auch|Wert864:Text99|/////XYZ/////'

Leider bin ich noch nicht so lange mit Perl unterwegs. Mit normalen Dateien, die zeilenweise eingelesen werden können, komme ich zurecht. Aber hier?

Über Hilfe würde ich mich freuen.

Gruß
Richard\n\n

<!--EDIT|rk-ger|1154981103-->
Ronnie
 2006-08-08 03:10
#68684 #68684
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Du kannst angeben welches Zeichen, oder welche Zeichenkette als Zeilenende von Perl verwendet wird. Hier ein kleines Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

{
local $/ = '/////XYZ/////'; #/
while (<DATA>) {
s/^\\+\w+\\+//g;
s/\/+\w+\/+$//g;
print Dumper [split /\|/, $_];
}
}

__DATA__
\\\\\XYZ\\\\\Wert100:D|Wert330:12345|Wert400:012345678970|Wert530:16|Wert545:02.08.2006|Wert760:0|Wert761:Hier steht 1 Wert|Wert800:Text1|Wert805:3782|Wert810:Text2|Wert811:Noch ein Wert|Wert820:Im Hafen 00|Wert821:D|Wert822:12345|Wert823:Deutschland|Wert853:XX|Wert854:1231329|Wert860:xxxxxxxxxxx|Wert861:Herr|Wert862:Max Muster|Wert863:Ja auch|Wert864:Text99|/////XYZ/////\\\\\XYZ\\\\\Wert100:D|Wert330:12345|Wert400:012345678970|Wert530:16|Wert545:02.08.2006|Wert760:0|Wert761:Hier steht 1 Wert|Wert800:Text1|Wert805:3782|Wert810:Text2|Wert811:Noch ein Wert|Wert820:Im Hafen 00|Wert821:D|Wert822:12345|Wert823:Deutschland|Wert853:XX|Wert854:1231329|Wert860:xxxxxxxxxxx|Wert861:Herr|Wert862:Max Muster|Wert863:Ja auch|Wert864:Text99|/////XYZ/////
\n\n

<!--EDIT|Ronnie|1154992371-->
Ronnie
 2006-08-08 03:34
#68685 #68685
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Wenn du lieber mit Hashes arbeitest, wäre auch das hier eine Möglichkeit:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my @lines;

{
local $/ = '/////XYZ/////'; #/
while (<DATA>) {
s/^\\+\w+\\+//g;
s/\/+\w+\/+$//g;
push @lines, {map {split /:/, $_} split /\|/, $_};
}
}

print Dumper \@lines;

Wie soll den die .csv-Datei die du ausgeben möchtest aussehen, da csv ja keine Schlüssel/Wert-Paare hat. Sollen die Schlüssel als erste Zeile mit ausgegeben werden?!
lichtkind
 2006-08-08 04:04
#68686 #68686
User since
2004-03-22
5680 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
- hatte was überlesen -\n\n

<!--EDIT|lichtkind|1155041693-->
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
esskar
 2006-08-08 09:37
#68687 #68687
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
oder man macht es richtig und benutzt gleich CPAN:csv module, die das schon koennen
<< >> 5 Einträge, 1 Seite



View all threads created 2006-08-08 00:04.