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