Mittwoch, 24. Oktober 2012

Ruby: Daten strukturiert einlesen mit FasterCSV

Heute mal ein kurzes Codebeispiel wie wir Daten mit Ruby strukturiert aus einer CSV-Tabelle auslesen und weiterverarbeiten können. Der unten stehende Codeausschnitt ist Teil aus einem größeren Script.

Die Anforderung bestand darin, dass die Rohdaten in einem CSV-File vorliegen und für eine Serie von API-Calls in einen XML-Payload umgewandelt werden müssen, jede Zeile sollte dabei getrennt behandelt werden:

Das CSV-File:

id;var1;var2
1;test1;test12
2;test2;test22
3;test3;test32

Hier ein Ausschnitt aus dem benötigten XML-Payload (am Beispiel des zweite Datensatzes):

<items>
    <code>id</code>
    <content>2</content>
</items>
<items>
    <code>var1</code>
    <content>test2</content>
</items>
<items>
    <code>var2</code>
    <content>test22</content>
</items>

Und hier mein Ruby-Codeschnipsel unter Verwendung des GEMs FasterCSV. Wie man sieht lese ich im ersten Schritt die Feldbezeichner aus der ersten Zeile des CSVs in ein Array (headerarray) und bestimme zugleich die Anzahl der Elemente über .length. Anschließend parse ich die Folgezeilen und baue die gewünschte Struktur durch Verketten eines Strings (items) auf.

linenumber = 0
headerarray = []
header_amount = 0

FasterCSV.foreach(csv_file, :quote_char => '"', :col_sep =>';', :row_sep =>:auto) do |row|

  if linenumber == 0 then  
     # Item Codes für Input Items aus Headerzeile einlesen
     headerarray = row
     header_amount = headerarray.length
     header_amount -= 1
  else
    # Für Folgezeilen Input Items einlesen und Items-Teil des XML-Payloads durch verketten generieren
    items = ""
    0.upto(header_amount) do |i|
      items += "<items><code>#{headerarray[i]}</code><content>#{row[i]}</content></items>"
    end
  end

  linenumber += 1

end

Keine Kommentare:

Kommentar veröffentlichen