2017-03-11 7 views
1

Ich habe diese CSV-Datei: http://www.gamesdeal.com/media/feedgenerator/Gamekey.csvCSV: Undefined offset -> Convert to XML

Und diesen Fehler mit PHP:

PHP Hinweis: Offset Nicht definiert: 6 in

Aber das Problem ist, dass ich die CSV-Datei nicht selbst erstellen kann. Es ist von einem Geschäft. Also, ich kann es nicht ändern ... Weiß jemand, wie ich diesen Fehler beheben kann?

Hier mein Code:

function csvToXML($inputFilename, $outputFilename, $delimiter = ','){ 

    // Open csv to read 
    $inputFile = fopen($inputFilename, 'rt'); 

    // Get the headers of the file 
    $headers = fgetcsv($inputFile, 0, $delimiter); 

    // Create a new dom document with pretty formatting 
    $doc = new DOMDocument('1.0', 'utf-8'); 
    $doc->preserveWhiteSpace = false; 
    $doc->formatOutput = true; 

    // Add a root node to the document 
    $root = $doc->createElement('products'); 
    $root = $doc->appendChild($root); 

    while (($row = fgetcsv($inputFile, 0, $delimiter)) !== false) { 

     $container = $doc->createElement('product'); 

     foreach ($headers as $i => $header) { 
       $child = $doc->createElement($header); 
       $child = $container->appendChild($child); 
       $value = $doc->createTextNode($row[$i]); 
       $value = $child->appendChild($value); 
     } 
     $root->appendChild($container); 
    } 

$strxml = $doc->saveXML(); 
    $handle = fopen($outputFilename, 'w'); 
    fwrite($handle, $strxml); 
    fclose($handle); 
} 
+0

Hat Ihre Eingabedatei Kommas in ihren Datenfeldern und nicht nur als Trennzeichen? Möglicherweise müssen Sie Ihrem [fgetcsv] (http://php.net/manual/en/function.fgetcsv.php) Aufruf einen Gehäusetyp hinzufügen. –

Antwort

1

Hier ist das Problem:

header: products_price <tab> price_currency 

data: 5.45 EUR (no tab between 5.45 and EUR) 

So im Header gibt es 7 Felder definiert, aber nur 6 in den Daten (auch die meisten Datensätze nicht habe einen EAN-Wert, aber am Ende gibt es einen Tab, damit sollte es ok sein).

Um dies zu beheben, könnte Sie:

  • manuell

  • erste products_price <tab> price_currency mit products_price price_currency im Header ersetzen

  • entfernen price_currency von $headers

  • alle Felder gelesen oder irgendwie lass das analysieren r wissen es gibt nur 6 felder statt 7

Wahrscheinlich müssen Sie danach das Preisfeld korrigieren.

+0

Vielen Dank für Ihre Antwort. Ich habe versucht, es zu beheben, aber es funktioniert nicht ... Mein Problem ist derzeit, Ihre Idee umzusetzen .. - Können Sie mir vielleicht ein kurzes Beispiel geben? - Außerdem ist das Trennzeichen '" \ t "'. Sie können es hier nicht sehen. Aber ich gebe der Funktion das Trennzeichen '" \ t "'. Das normale Trennzeichen ist '", "' wenn ich der Funktion kein Trennzeichen gebe. –

+1

Für einen ersten schnellen Test könnten Sie die Datei manuell bearbeiten - in der Kopfzeile kombinieren Sie die beiden Preisfelder wie folgt: products_price_price_currency und sehen, ob das funktioniert. Wenn nicht, versuchen Sie zu sehen, wo Sie einen Fehler bekommen - vielleicht drucken Sie die Zeilen (und entfernen Sie dann die foreach-Schleife) und später die Felder mit der foreach-Schleife. –

+1

Auch in Zeile 4111 SD0006586 gibt es eine Registerkarte im Produktnamen (vor dem '-'), so dass die Felder nach rechts verschoben werden (aber das sollte Ihren Code nicht brechen). –