Ich habe ein Problem mit einem Programm, das durch eine CSV-Datei mit ein paar Millionen Datensätze durchsucht: zwei Felder in jeder Zeile hat Kommentare, die Benutzer eingegeben haben und manchmal verwenden sie Kommas in ihren Kommentaren. Wenn Kommas eingegeben werden, wird dieses Feld in doppelte Anführungszeichen gesetzt. Ich muss alle Kommas in diesen Feldern durch ein Leerzeichen ersetzen. Hier ist eine solche Zeile aus der Datei Ihnen eine Idee zu geben -Komma durch Leerzeichen in nur einem Feld ersetzen - aus einer CSV-Datei
1925,47365,2,650187016,1,1,"MADE FOR DRAWDOWNS, NEVER P/U",16,IFC 8112NP,Standalone-6,,,44,10/22/2015,91607,,B24W02651,,"PA-3, PURE",4/28/2015,1,0,,1,MAN,,CUST,,CUSTOM MATCH,0,TRUE,TRUE,O,C48A0D001EF449E3AB97F0B98C811B1B,POS.MISTINT.V0000.UP.Q,PROD_SMISA_BK,414D512050524F445F504F5331393235906F28561D2F0020,10/22/2015 9:29,10/22/2015 9:30
HINWEIS - Ich habe nicht den Text hat :: CSV-Modul zur Verfügung zu mir, noch wird es in dem Server verwende ich zur Verfügung gestellt werden.
Hier ist ein Teil meines Codes in der Analyse dieser Datei. Das erste, was ich mache, ist die Verkettung der allerersten drei Felder und das Voranstellen dieses verketteten Feldes an jede Zeile. Dann möchte ich die Kommata in @fields [7,19] löschen, dann das DATUM in drei Feldern und das DATETIME in zwei Feldern formatieren. Die einzige Linie, die ich kann nicht herausfinden, ist diese Kommata Entrümpelung -
my @data;
# Read the lines one by one.
while ($line = <$FH>) {
# split the fields, concatenate the first three fields,
# and add it to the beginning of each line in the file
chomp($line);
my @fields = split(/,/, $line);
unshift @fields, join '_', @fields[0..2];
# remove user input commas in fields[7,19]
$_ = for fields[7,19];
# format DATE and DATETIME fields for MySQL/sqlbatch60
$_ = join '-', (split /\//)[2,0,1] for @fields[14,20,23];
$_ = Time::Piece->strptime($_,'%m/%d/%Y %H:%M')->strftime('%Y-%m-%d %H:%M') for @fields[38,39];
# write the parsed record back to the file
push @data, \@fields;
}
Wie parst du eine CSV-Datei korrekt? Sie verwenden ein gut gestaltetes, gut getestetes Modul wie [Text :: CSV] (https://metacpan.org/pod/Text::CSV). –
Die "_up to_" 30 ist ein Problem - was ist, wenn es 10 Zeichen ist, mit ein paar Kommas und dann ein legitimes Komma (Feldtrennzeichen)? Gibt es etwas, das Sie nach Feld 7 mit Sicherheit über bestimmte Felder wissen? (Zum Beispiel, "ah, Feld 10 muss immer mit ... beginnen") – zdim
@zdim - Jetzt wird mir gesagt, dass es in diesem Feld doppelte Anführungszeichen geben wird, wenn ein Komma vom Benutzer eingegeben wurde. Kann ** tr /,//; ** verwendet werden? – BigRedEO