Inhalt

CSV-Dateien mit variablen Header umsortieren

Inhalt

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.