2016-05-10 13 views
2

Ich importiere eine CSV-Datei in eine MySQL-Datenbank. Um die CSV zu analysieren, verwende ich fgetcsv(). Die CSV enthält "characeters, die nicht entgangen sein, und die Ursachen und error array_combine(): Both parameters should have an equal number of elementsParsen unescaped doppelte Anführungszeichen mit fgetcsv

Die CSV-Daten in diesem Format:

"GR109  "," ",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0," ","GRANT  ","M   ","W",0,0.0,0.0,0.0,0.0,0.0,0,0,0,0,0,0.0,0.0," ",0,0,0.0," "," "," ",2.42,0.0,0.0,0.0,0.0," "," "," "," "," "," ",0.0,0.0,0.0,0.0,0.0," "," "," "," ","SELF COL ","16 P PR. "," ","PLAIN  "," ","R/E1ROW "," "," "," "," "," "," "," ","R/E1ROW ","BEADED "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ","GRANT  ","GRANT  "," "," "," "," ",0.0," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ","VAMP LNG - BLK. CARAVELLE P/S. QTR. LNG./ TNG.LINING - BLK. TORINO. (GREY ""TORINO"" FOR LIZARD.)","GR109 COMPLETE" 

Mein Code:

function csv_to_array($filename='', $delimiter=',', $enclosure='"', $escapestring='"') 
{ 
if(!file_exists($filename) || !is_readable($filename)) 
    return FALSE; 

$header = NULL; 
$data = array(); 
if (($handle = fopen($filename, 'r')) !== FALSE) 
{ 
    while (($row = fgetcsv($handle, 1000, $delimiter, $enclosure, $escapestring)) !== FALSE) 
    { 
     if(!$header) 
      $header = $row; 
     else 
      $data[] = array_combine($header, $row); 
    } 
    fclose($handle); 
} 
return $data; 

}

I hinzugefügt $escapestring='"', aber das hat nicht geholfen .. Ist der Fehler von "" TORINO "" wo das "Zeichen nicht entkommen ist? Wenn ja, gibt es einen Weg, mit diesen Feldern umzugehen?

+0

Es aussehen, als ob "" (2 doppelte Anführungszeichen) sind als Anführungszeichen zu analysieren. Das heißt, du könntest sie einfach ersetzen/herausfiltern und du solltest gut gehen. –

+0

Sie müssen nicht die '$ vestringstrings 'übergeben, da das doppelte Anführungszeichen bereits durch doppelte Anführungszeichen entfernt wurde.Sie können dies sehen, indem Sie einfach einen fgetcsv in der einzelnen Zeile ausführen, die Sie gepostet haben, und Sie erhalten das richtige Array. Können Sie eine minimale CSV-Datei posten, die zum Fehler einschließlich der Kopfzeile führt? –

+0

Könnten Sie mehr von CSV-Datei zur Verfügung stellen? Vor allem Header. Doppelte Einträge im Header (leere Strings, Zahlen) könnten Dinge durcheinander bringen. – Deus777

Antwort

0

Ok. Ich denke, ich habe es gefunden. Definitiv zweiter Parameter in fgetcsv, der die Länge der Leitung ist, etwas durcheinander gebracht. Ändere es einfach auf 0 (Funktion könnte sehr viel langsamer arbeiten), oder verdopple es. Als es 1000 war, wurde jede Reihe in zwei Reihen geschnitten, eine mit einer Länge von genau 1000 Zeichen (das Schneiden wurde sogar in der Mitte der Welt gemacht) und die zweite Reihe war der Rest der Linie bis zum Newline-Charakter. So $ row Variable zunächst ein Array mit 117 Länge war, dann etwa 13, noch einmal 117 und 13.

Genau dies ändern:

while (($row = fgetcsv($handle, 1000, $delimiter, $enclosure, $escapestring)) !== FALSE) 

dazu:

while (($row = fgetcsv($handle, 0, $delimiter, $enclosure, $escapestring)) !== FALSE) 
+0

Das hat perfekt funktioniert. Vielen Dank. –

+0

Gern geschehen. – Deus777

1

Ihr Code funktioniert perfekt für mich. Im folgenden Beispiel habe ich die Headerbehandlung entfernt, da Ihre Beispieldaten keinen Header enthalten.

<?php 

function csv_to_array($filename='', $delimiter=',', $enclosure='"', $escapestring='"') 
{ 
    if(!file_exists($filename) || !is_readable($filename)) 
     return FALSE; 

    $data = array(); 
    if (($handle = fopen($filename, 'r')) !== FALSE) { 
     while (($row = fgetcsv($handle, 1000, $delimiter, $enclosure, $escapestring)) !== FALSE) { 
      $data[] = $row; 
     } 
     fclose($handle); 
    } 
    return $data; 
} 

$result = csv_to_array('test.csv'); 
foreach ($result as $key=>$element) { 
    echo $key . ' => ' . print_r($element,true) . "\n"; 
} 

Wenn die Datei test.csv enthält Ihren angegebenen CSV-String, dann ist der offensichtliche Ausgang (verkürzt):

0 => Array 
(
    [0] => GR109  
    [1] => 
    [2] => 0.0 
    [3] => 0.0 
    // ..... 
    [127] => 
    [128] => VAMP LNG - BLK. CARAVELLE P/S. QTR. LNG./ TNG.LINING - BLK. TORINO. (GREY "TORINO" FOR LIZARD.) 
    [129] => GR109 COMPLETE 
) 
0
$result = preg_replace('/"((?=[^"]*)(?=(?=[^"]*)))"/', '$1', $subject); 

Die Regex oben wird entfernen doppelte Anführungszeichen innerhalb doppel- Zitate. Es wird für die Arbeit mit:

  1. "some text "in Anführungszeichen" mehr Text"

  2. "" in Anführungszeichen "mehr Text"



Ideone demo

Verwandte Themen