2014-01-12 13 views
6

Ich muss Header in einer CSV-Datei validieren, bevor Sie Daten darin analysieren.Wie bekomme ich Header aus einer CSV-Datei in Ruby

# convert the data into an array of hashes 
CSV::Converters[:blank_to_nil] = lambda do |field| 
    field && field.empty? ? nil : field 
end 
csv = CSV.new(file, :headers => true, :header_converters => :symbol, :converters => [:all, :blank_to_nil]) 
csv_data = csv.to_a.map {|row| row.to_hash } 

Ich weiß, dass ich Header-Methode verwenden, können die Header

headers = csv.headers 

Aber das Problem mit headers method ist es „Returns zu bekommen nil wenn Header nicht verwendet werden, wahr, wenn sie wollen, aber noch nicht gelesen wurde, oder die tatsächlichen Header, nachdem sie gelesen wurden. "

Wenn ich also headers = csv.headers oben csv_data = csv.to_a.map {|row| row.to_hash } Spiel setzen headerstrue ist, und wenn ich es nach dem Lesen der Daten, enthalten headers Zeilenüberschriften in einem Array. Es enthält eine Reihenfolge von Anweisungen zu meiner Methode, die sehr schwer zu testen ist und eine schlechte Programmierung darstellt.

Gibt es eine Möglichkeit, Kopfzeilen zu lesen, ohne Reihenfolge in diesem Szenario aufzuerlegen? Ich benutze Ruby 2.0.

Antwort

0

Ich verstehe nicht ganz das Problem. Wenn Sie eine der Iterator-Methoden verwenden, ist es ziemlich einfach, einige Überprüfungen auf den Headern durchzuführen:

3

Ich bekomme das Problem! Ich habe das gleiche. Der Aufruf read scheint zu tun, was Sie wollen (füllt die headers Variable):

data = CSV.new(file, **flags) 
data.headers # => true 

data = CSV.new(file, **flags).read 
data.headers # => ['field1', 'field2'] 

Es könnten auch andere Nebenwirkungen sein, die ich nicht bewusst bin, aber das funktioniert für mich und riecht nicht so schlecht.

9
CSV.open(file_path, &:readline) 
Verwandte Themen