2017-01-11 2 views
0

Ich benutze Ruby 2.4. Wie kann ich einen gegebenen String als eine Zeile in einer CSV-Datei behandeln und mit dem Trennzeichen diese Zeile in ein Token-Array aufteilen? Alle Beispiele online, die ich gefunden habe, zum BeispielWie teile ich eine Zeichenfolge (nicht eine Datei) als eine Zeile in einer CSV-Datei und parse die Zeichenfolge?

erfordern das Einlesen einer ganzen Datei. Es ist verschwenderisch, meine Zeile in eine Datei zu schreiben, die Datei zurück zu lesen und dann die temporäre Datei zu löschen, die ich erstellt habe. Die Verwendung der "Split" -Funktion scheint nicht sicher zu sein, wenn das Trennzeichen ein Komma ist, da CSV-Dateien manchmal Kommata in den Daten enthalten (in diesem Fall umgeben Anführungszeichen die Daten).

Ein Beispiel für eine solche Zeichenfolge könnte

a,b,c,d,e 

werden, wenn die in "\ t" bestanden Trennzeichen ist, wäre das Ergebnis [ "a, b, c, d, e"], aber wenn die der verwendete Begrenzer war ein ",", das Ergebnis wäre ["a", "b", "c", "d", "e"]

+1

Nicht sicher, warum Sie FasterCSV verwenden, wenn das integrierte CSV-Modul äquivalent ist. – tadman

+0

Wie @tadman sagte, ist FasterCSV _is_ Ruby's integrierte CSV, also benutze einfach CSV für Klarheit und Einfachheit. Dann würde ich empfehlen, die Beispiele in [der Dokumentation] (http://ruby-doc.org/stdlib-2.4.0/libdoc/csv/rdoc/CSV.html) zu lesen, da sie dies sehr gut abdecken. –

Antwort

2

Wenn Sie haben willkürliche Zeichenkettendaten, die Sie als CSV analysieren möchten, können Sie einfach parse verwenden. Keine Notwendigkeit für eine temporäre Datei:

require 'csv' 

commas = %Q[a,b,"c,d"] 

CSV.parse(commas) 
# => [["a", "b", "c,d"]] 

tabs = %Q[a\tb\t"c\td"] 

CSV.parse(tabs, col_sep: "\t") 
# => [["a", "b", "c\td"]] 

Die col_sep Option können Sie angeben, welche Trennzeichen verwendet wird.

4

FasterCSV ist seit langem adopted as the CSV module in der Ruby-Standardbibliothek. Nur require "csv".

Ein sehr kurzer Blick auf die CSV-Dokumente zeigt die CSV.parse_line Methode.

require "csv" 
CSV.parse_line("a,b,c,d,e") 
# => ["a", "b", "c", "d", "e"] 

CSV.parse nimmt alle the same options as CSV.new et al, so können Sie die Option col_sep: "\t" passieren stattdessen Tabs als Trennzeichen zu verwenden:

CSV.parse_line("a,b,c,d,e", col_sep: "\t") 
# => ["a,b,c,d,e"] 

Sehen Sie es auf repl.it: https://repl.it/FGft/1

+0

In Ihrem Beispiel, CSV.parse_line ("a, b, c, d, e"), woher weiß es, was das Token-Trennzeichen ist, oder nimmt es einfach an, dass es immer ein Komma ist? –

+0

Es ist standardmäßig ein Komma ("CSV" steht für "Komma-getrennte Werte"). Wie ich schon sagte, benötigt man [die gleichen Optionen] (https://ruby-doc.org/stdlib-2.3.3/libdoc/csv/rdoc/CSV.html#method-c-new) als "CSV.new" , so können Sie die 'col_sep:" \ t "' Option übergeben, um stattdessen Tabs zu verwenden. Ich habe meine Antwort mit einem zweiten Beispiel aktualisiert. –

Verwandte Themen