CSV-Dateien mit variablen Header umsortieren
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.