【问题标题】:Parsing CSV with headers in Ruby?在 Ruby 中解析带有标题的 CSV?
【发布时间】:2012-06-08 14:27:17
【问题描述】:

这行得通:

    require 'csv'
    file = CSV.open(filename)
    puts file.shift

这不是:

    require 'csv'
    file = CSV.open(filename, :headers=>true)
    puts file.shift

我明白了:

C:/Program Files (x86)/IronRuby 1.1/Lib/ruby/1.9.1/csv.rb:2177:in `convert_field
s': undefined method `with_index' for IronRuby.Builtins.Enumerator:Enumerator (N
oMethodError)
    from C:/Program Files (x86)/IronRuby 1.1/Lib/ruby/1.9.1/csv.rb:2218:in `
parse_headers'
    from C:/Program Files (x86)/IronRuby 1.1/Lib/ruby/1.9.1/csv.rb:1918:in `
shift'
    from C:/Program Files (x86)/IronRuby 1.1/Lib/ruby/1.9.1/csv.rb:1818:in `
loop'
    from C:/Program Files (x86)/IronRuby 1.1/Lib/ruby/1.9.1/csv.rb:1818:in `
shift'
    from C:/myproject/myproject/myproject/Program.rb:3

我正在使用 Ironruby 1.1.3

我正在寻找正确的语法来获得带有 headers 选项的单行。

【问题讨论】:

    标签: ruby parsing csv


    【解决方案1】:

    您可以试试这个,注意 colsep,使其适应您在 CSV 文件中的内容。 如果要显示标题:

    require 'csv'
    
    path = "G:/documents/musicinfo"
    Dir.glob("#{path}/**/*.csv").each {|file|
      CSV.foreach(file, :col_sep => ';') do |row|
        puts "#{file} => #{row}"
        break
      end
    }
    

    作为数组给出:

    G:/documents/musicinfo/album.csv => ["album_release_year", "album_id", "artist_id", "album"]
    G:/documents/musicinfo/artist.csv => ["artist_id", "artist_name"]
    G:/documents/musicinfo/Copy of all2.csv => ["album_release_year,album_id,track_id,artist_id,artist_name,duration,genre,track_popularity,disc_number,track_number,track,album"]
    G:/documents/musicinfo/genres.csv => ["genreId", " genreNaam"]
    G:/documents/musicinfo/songs.csv => ["album_id", " track_id", " artist_id", " track_popularity", "genre_id", "track"]
    

    并且,如果您想显示第一个数据行或将其保留为 CSV,请使用以下内容进行调整:

    CSV.foreach(file, :col_sep => ';', :headers => true) do |row|
    

    这给出了:

    G:/documents/musicinfo/album.csv => 0000,10747312,11522976,Beyond Imagination (Bonus Track Version)
    G:/documents/musicinfo/artist.csv => 10000004,Jimi Hendrix
    G:/documents/musicinfo/Copy of all2.csv => "2008,12877382,24516577,10000004,Jimi Hendrix,05:39,Pop,9,16,1,10,Free spirit"
    G:/documents/musicinfo/genres.csv => 1,Alternative
    G:/documents/musicinfo/songs.csv => 12877382,24516577,10000004,9,16,Free spirit
    

    【讨论】:

    • 我不想迭代行
    • 然后在第一行之后返回
    • 这不是我想要的。 (我必须从多个文件中获取第一行,然后是第二行,等等)
    • 啊,我调整了我的答案,下次,请发布更多代码,这样我们就不用猜测了
    • 好吧,您的解决方案只给出了第一行,然后我需要获得第二行、第三行等。反正我知道自己该怎么做。我的问题特别是关于如何使用带有 headers 选项的 shift 方法。
    【解决方案2】:

    我在不同的引擎中对此进行了测试,这似乎是 Ironruby 中的一个错误

    【讨论】:

      猜你喜欢
      • 2011-01-06
      • 1970-01-01
      • 2017-05-25
      • 2015-05-26
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多