Ich stand diese Woche vor der Aufgabe, eine CSV-Datei einzulesen. Eigentlich ein triviales Problem. Knackpunkt dabei war allerdings, dass die CSV-Datei einen variablen Header besitzt. Ich wollte aus der CSV-Datei nur eine bestimmte Teilmenge extrahieren, die über alle CSV-Dateien gleich ist. Nur die Position der Information (Spalten) konnte variieren. Die Spaltennamen sind in alle CSV-Headern identisch. Anbei ein paar Codeschnipsel in PHP, wie ich das Problem gelöst habe.
// Kopfzeile analysieren und Mapping bauen $fieldsFeedFirstLine = explode("\t",$feedData[0]); $i = 0; $arrPosition = array(); foreach ($fieldsFeedFirstLine as $fieldName) { switch ($fieldName) { case "column1" : $arrPosition[1] = $i; break; case "column2" : $arrPosition[2] = $i; break; case "column3" : $arrPosition[3] = $i; break; case "column4" : $arrPosition[5] = $i; break; case "column5" : $arrPosition[7] = $i; break; case "column6" : $arrPosition[8] = $i; break; } $i++; } ksort($arrPosition);
Das Mapping-Array enthält jetzt die Quellposition ($i) und die Zielposition (Array-Key) für die gewünschte CSV-Datei.
// Datensätze durchackern und entsprechend dem Mapping-Array zuordnen for ($i=0; $i<count($feedData); $i++) { if ($i==0) continue; $items = explode("\t",$feedData[$i]); $arrOutput = array(); foreach ($arrPosition as $posKey => $posValue) { $arrOutput[$posKey] = $items[$posValue]; } }
Das gewünschte Ergebnis der Umsortierung steht dann in $arrOutput, das man bei Bedarf noch weiter modifizieren kann. Falls du eine bessere Lösung für das Grundproblem hast, kannst du sie gerne bei mir einreichen oder als Kommentar posten.