2017-11-06 2 views
3

Ich habe ein Problem mit einigen korrupten CSV-Datei. Ich bekomme es wie folgt aus:Regex für falsch zitierte CSV-Datei

column1,column2,column3,column4,column5,column6 
123,"some text",""column3 text"",""still column3 text"",4,234,"" 
123,"some text",""column3 text"",4,234,"" 

In Tabelle sollte es so aussehen:

column1 | column2 | column3       | column4 | column5 | column6 
123  | some text | "column3 text, still column3 text" | 4  | 234  | 
123  | some text | "column3 text"      | 4  | 234  | 

ich die Datei mit php lese und versuchte es mit str_getcsv in ein Array zu verwenden. Aber wegen dieser gebrochenen Zitate wird es nicht funktionieren und immer mehr Spalten als Titel haben.

Insgesamt brauche ich keinen Wert von Spalte 3, also habe ich versucht, einige Regex zu machen, um drei Gruppen zu machen und dann preg_replace. Aber ich bekomme keine Regex, die für beide Zeilen funktioniert.

Mit dieser regex bekomme ich nur erste Zeile: https://regex101.com/r/OjTAAC/1

und damit ich nur zweite Zeile erhalten: https://regex101.com/r/I2xqPs/1

Wer etwas Hilfe hat, wie einen regulären Ausdruck zu erhalten, die für beide Situationen funktioniert?

+0

Es muss einen anderen Weg geben [diese regex] (https://regex101.com/r/ngiijv/1) scheint zu umständlich. –

+0

das leere "" am Ende wird Probleme machen – Eumel

+0

Sie könnten Zeilen aufteilen und eine fallweise Regex Abhängigkeit von der Anzahl der Kommas – Eumel

Antwort

1

Es kann eine einfachere Lösung geben, ich würde sichern oder eine Kopie der Datei haben, und Sie müssen es möglicherweise anders machen, es ist groß.

Lässt etwas anderes versuchen

//$str = '123,"some text",""column3 text"",""still column3 text"",4,234,""'; 
//$str = '123,"some text",""column3 text"",4,234,""' 

while (($str = fgets($handle, 4096)) !== false) {  
    $str = str_replace('"', '', $str); 
    $line = explode(',',$str); 

    //combine line item 2,3 
    if(count($line) == 7){ 
     $line[2] .= ', '.$line[3]; 
     //remove item 3 
     unset($line[3]); 
     $line = array_values($line); 
    } 
    print_r($line); 
} 

Solange die Linien im Einklang mit, was Ihnen zeigen, es sollte funktionieren.

$array =[ 
    '123,"some text",""column3 text"",""still column3 text"",4,234,""', 
    '123,"some text",""column3 text"",4,234,""' 
]; 

foreach($array as $str){ 
    $str = str_replace('"', '', $str); 
    $line = explode(',',$str); 

    //combine line item 2,3 
    if(count($line) == 7){ 
     $line[2] .= ', '.$line[3]; 
     //remove item 3 
     unset($line[3]); 
     $line = array_values($line); 
    } 
    print_r($line); 
} 

Ausgänge

Array 
(
    [0] => 123 
    [1] => some text 
    [2] => column3 text, still column3 text 
    [3] => 4 
    [4] => 234 
    [5] => 
) 
Array 
(
    [0] => 123 
    [1] => some text 
    [2] => column3 text 
    [3] => 4 
    [4] => 234 
    [5] => 
) 

Sie können es hier testen.

http://sandbox.onlinephpfunctions.com/code/f39eb94ccef045213a30385cc7daa326ce3aa25d

+0

Hey, danke für deine Antwort, Aber mein Problem ist nicht das "" am Ende der Zeile. Es ist der Column3-Wert, der in der CSV-Datei komplett zerbrochen ist. –

+0

Wie gesagt In meiner Antwort ist das '' '' am Ende der Zeile absolut gültig. Was ich schreibe, wird so lange funktionieren, wie es keine gültigen doppelten Anführungszeichen gibt. "" "", Wobei das eine am Ende ein Beispiel für ein gültiges Doppelzitat ist. – ArtisticPhoenix

+0

Ja, das wäre eine funktionierende Lösung. Die Idee, alles zu ersetzen "" hatte ich noch nicht. Mein Workaround sieht im Moment so aus http://sandbox.onlinephpfunctions.com/code/8e6c63130111cda0018aaf545fd021397fe4e80c –

Verwandte Themen