Sinnfreie Zeichen in CSV entfernen

Moritz123

Erfahrenes Mitglied
Hallo!

ich habe hier ein kleines Problem mit einer CSV-Datei: Diese verwendet Semikola als Trennzeichen für die einzelnen Felder. Nun kam irgendjemand auf die glorreiche Idee ebensolche Semikola als Trennzeichen innerhalb eines Feldes zu verwenden, was es mir nahezu unmöglich macht, dieses sauber zu parsen, da ich anhand des Semikolons jede Zeile explode.
Mein Ansatz war nun mittels preg_replace Semikola die zwischen zwei Anführungszeichen stehen durch Kommas zu ersetzen. Leider gelingt es mir nicht, den entsprechenden regulären Ausdruck dafür zu formulieren.
Könntet Ihr mir helfen oder kennt Ihr eine bessere Variante, um die CSV-Datei zu parsen?

Vielen Dank und beste Grüße,
 
Ist es nicht einfacher, wenn du die Datei einfach mit dem ganz normalen Editr öffnest und dann per suchen und ersetzen arbeitest? Oder steht noch etwas anderes zwischen den beiden Ausrufezeichen als ein Semikolon?
 
Hallo,

danke für deine Antwort.
Da das ganze später mal von einem Laien bedient werden soll, steht die Variante Editor nicht zur Verfügung.
Noch ein Bespiel für eine Zeile:
Code:
"Das;ist; ein;Feld"; Wert2; Wert3
Da ich anhand von Semikola das Feld splitte, interpretiert er das erste Feld der Zeile in obigem Beispiel als drei Felder, was die Daten natürlich beim Import in die Datenbank verschiebt.
Mein pre_replace sieht wie folgt aus, funktionert allerdings nicht:
PHP:
$lines = preg_replace("/\"[a-zA-Z0-9];[a-zA-Z0-9]\"/", "/[a-zA-Z0-9],[a-zA-Z0-9]/", $lines);

Vielen Dank nochmals.
 
Ich sehe das Problem darin, dass offensichtlich eine beliebeige Anzahl von Semikola in dem String vorkommen können. Ich persönlich kenne mich nicht so gut mit RegExp aus um zu sagen ob und wie das geht. Hast du denn die Möglichkeit von CSV auf TSV zu wechseln. Dann hättest du das Problem nicht, es sei denn in dem Text würden Tabs genutzt, was aber glaube ich nicht der Fall sein wird.
 
Hab so schnell kein Pattern finden können.

Vielleicht muss du da mit PHP dran. Bischen Pseudocode:
Code:
str_getcsv von der Zeile machen;
durchlauf vom array {
  wenn an erster stelle ein " steht dann ist man im text {
    solange das nächste element anhängen und aus eigentlichen array herausschneiden,
    wie der text geht (an letzter position wird ein " sein)

    alle ; im akutellen array-element durch ein \; oder sonstiges ersetzen
  }
}

EDIT: Seh grad bei php.net hat jemand schon so eine Funktion geschrieben: http://www.php.net/manual/de/function.split.php#82050
 
Zuletzt bearbeitet:
Hallo!

ich habe nun statt fgets fgetscsv mit dem enclosure " verwendet. Damit geht es auch ohne preg_replace.

Vielen Dank für tatkräftige Unterstützung.
 
Hier mal was hingekritzelt ;)

PHP:
<?php
$str = '"Das;ist; ein;Feld"; Wert2; Wert3;"noch; ein; test"';
$rxp = '#\"(.+)\"#U';

preg_match_all($rxp, $str, $matches);

print_r($matches);

foreach($matches[0] as $value)
{
	$str = str_replace($value, str_replace(';', '!', $value), $str);
}
echo $str;
?>

/edit: Auch eine Möglichkeit ;)
 
Zurück