User since
2006-08-07
45
Artikel
BenutzerIn
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-->
User since
2003-08-14
2022
Artikel
BenutzerIn
Du kannst angeben welches Zeichen, oder welche Zeichenkette als Zeilenende von Perl verwendet wird. Hier ein kleines Beispiel:
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-->
User since
2003-08-14
2022
Artikel
BenutzerIn
Wenn du lieber mit Hashes arbeitest, wäre auch das hier eine Möglichkeit:
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?!
User since
2004-03-22
5697
Artikel
ModeratorIn + EditorIn
- hatte was überlesen -\n\n
<!--EDIT|lichtkind|1155041693-->
User since
2003-08-04
7321
Artikel
ModeratorIn
oder man macht es richtig und benutzt gleich
csv module, die das schon koennen