【问题标题】:Working with large CSV files in Ruby在 Ruby 中处理大型 CSV 文件
【发布时间】:2015-04-19 13:20:09
【问题描述】:

我想解析 MaxMind GeoIP2 数据库的两个 CSV 文件,基于一列做一些连接并将结果合并到一个输出文件中。

我使用了标准的 CSV ruby​​ 库,它很慢。我认为它会尝试将所有文​​件加载到内存中。

block_file = File.read(block_path)
block_csv   = CSV.parse(block_file, :headers => true) 
location_file = File.read(location_path)
location_csv = CSV.parse(location_file, :headers => true)


CSV.open(output_path, "wb",
    :write_headers=> true,
    :headers => ["geoname_id","Y","Z"] ) do |csv|


    block_csv.each do |block_row|
    puts "#{block_row['geoname_id']}"

        location_csv.each do |location_row|
            if (block_row['geoname_id'] === location_row['geoname_id'])
                puts " match :"    
                csv << [block_row['geoname_id'],block_row['Y'],block_row['Z']]
                break location_row
            end
        end

    end

是否有另一个支持块处理的 ruby​​ 库?

block_csv 是 800MB,location_csv 是 100MB。

【问题讨论】:

    标签: ruby csv data-integration


    【解决方案1】:

    只需使用CSV.open(block_path, 'r', :headers =&gt; true).each do |line| 代替File.readCSV.parse。它将逐行解析文件。

    在您当前的版本中,您明确告诉它使用File.read 读取所有文件,然后使用CSV.parse 将整个文件解析为字符串。所以它完全按照你说的做。

    【讨论】:

      猜你喜欢
      • 2012-11-30
      • 2015-02-20
      • 1970-01-01
      • 2015-10-10
      • 2018-02-23
      • 2012-05-30
      • 1970-01-01
      • 2017-07-05
      相关资源
      最近更新 更多