2012-04-11 4 views
2

Meine App importiert einige CSV-Daten und ich baue ein Array, serialisieren es und speichern es in einem Datenbankfeld. Ich speichere es in serialisieren Form, weil die Daten jedes Mal eine andere Struktur hat ... manchmal 3 Spalten, manchmal 10 Spalten, etc.in Ruby, wie kann ich ein Array serialisieren und den numerischen/String-Typ jedes Elements beibehalten?

[["Frucht", "Preis", "Gewicht"], [ "Apple", 1.23, 4.5], ["Orange", 5.2, 3.3]]

Die importierten Daten haben Anführungszeichen um Zeichenfolgen, und keine Anführungszeichen um Zahlen, so dass ich während des Imports den Typ beibehalten kann jedes Element.

Aber wenn ich es serialisiert werden (in einem Datenbankfeld speichern) mit ActiveSupport::JSON.encode(csv_data) jedes Element wird als Zeichenfolge gespeichert

[[ "Früchte", "Preis", "Gewicht"], [ "von Apple "," 1.23 "," 4.5 "], [" Orange "," 5.2 "," 3.3 "]]

so, wenn ich es serialisieren, die numerischen Werte wurden in Zeichenfolgen konvertiert, aber ich brauche sie als numerisch für die Nachbearbeitung.

Das Problem ist, jeder Datenimport ist anders ... manchmal es; s alle numerischen, manchmal die erste Spalte ist Zeichenfolge, manchmal 2 oder 3 Spalten möglicherweise Strings.

Ich interessiere mich nicht, wenn ich JSON oder nicht benutze - ich brauche nur eine Möglichkeit, um die Daten zu kodieren und zu dekodieren, so dass ich es in ein Datenbankfeld stopfen kann, ohne den 'Typ' zu verlieren.

Sollte ich eine Art von XML-Methode anstelle von JSON verwenden?

Antwort

3

Marshal zur Rettung!

tmp = [["fruit", "price", "weight"], ["Apple", 1.23, 4.5], ["Orange", 5.2, 3.3]] 
dmp = Marshal.dump(tmp) 
p Marshal.load(dmp) 
# => [["fruit", "price", "weight"], ["Apple", 1.23, 4.5], ["Orange", 5.2, 3.3]] 
+0

Beachten Sie, dass das Marshall-Format inkompatibel ist zwischen verschiedenen Versionen (1.9 gegenüber 2.0) und Implimentationen (MRI gegen JRuby) von Ruby. – Kris

Verwandte Themen