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.

Schreibe einen Kommentar