【问题标题】:Removing whitespaces in a CSV file删除 CSV 文件中的空格
【发布时间】:2013-01-04 16:53:34
【问题描述】:

我有一个带有额外空格的字符串:

First,Last,Email  ,Mobile Phone ,Company,Title  ,Street,City,State,Zip,Country, Birthday,Gender ,Contact Type

我想解析这一行并删除空格。

我的代码如下:

namespace :db do
task :populate_contacts_csv => :environment do

require 'csv'

csv_text = File.read('file_upload_example.csv')
  csv = CSV.parse(csv_text, :headers => true)
    csv.each do |row|
      puts "First Name: #{row['First']} \nLast Name: #{row['Last']} \nEmail: #{row['Email']}"
    end
  end
end

【问题讨论】:

    标签: ruby parsing csv rake-task


    【解决方案1】:
    @prices = CSV.parse(IO.read('prices.csv'), :headers=>true, 
       :header_converters=> lambda {|f| f.strip},
       :converters=> lambda {|f| f ? f.strip : nil})
    

    nil 测试被添加到行而不是标题转换器,假设标题永远不会为 nil,而数据可能是,并且 nil 没有 strip 方法。我真的很惊讶,AFAIK, :strip 不是预定义的转换器!

    【讨论】:

    • 您可以使用-> 语法,而不是使用语法lambda {|f| f.strip},例如:->(f) {f.strip}
    • 这是我的问题的解决方案,也适用于 CSV.new,而不仅仅是 CSV.parse。
    • 同样来自 ruby​​ 2.3,->(f) { f&.strip }
    【解决方案2】:

    你可以先strip你的哈希:

    csv.each do |unstriped_row|
      row = {}
      unstriped_row.each{|k, v| row[k.strip] = v.strip}
      puts "First Name: #{row['First']} \nLast Name: #{row['Last']} \nEmail: #{row['Email']}"
    end
    

    编辑也去除散列键

    【讨论】:

    • 这行不通。 “电子邮件”的标头不是“电子邮件”,导致代码找不到值。
    【解决方案3】:

    CSV 支持headersfields 的“转换器”,这样您就可以在数据传递到each 循环之前进入数据内部。

    编写示例 CSV 文件:

    csv = "First,Last,Email  ,Mobile Phone ,Company,Title  ,Street,City,State,Zip,Country, Birthday,Gender ,Contact Type
    first,last,email  ,mobile phone ,company,title  ,street,city,state,zip,country, birthday,gender ,contact type
    "
    File.write('file_upload_example.csv', csv)
    

    我会这样做:

    require 'csv'
    csv = CSV.open('file_upload_example.csv', :headers => true)
    [:convert, :header_convert].each { |c| csv.send(c) { |f| f.strip } }
    
    csv.each do |row|
      puts "First Name: #{row['First']} \nLast Name: #{row['Last']} \nEmail: #{row['Email']}"
    end
    

    哪些输出:

    First Name: 'first'
    Last Name: 'last'
    Email: 'email'
    

    当从文件中读取每个标题和每个字段时,转换器会简单地去除前导和尾随空格。

    另外,作为编程设计选择,不要使用以下方法将文件读入内存:

    csv_text = File.read('file_upload_example.csv')
    

    然后解析它:

    csv = CSV.parse(csv_text, :headers => true)
    

    然后循环遍历它:

    csv.each do |row|
    

    Ruby 的 IO 系统支持逐行“枚举”文件。一旦我的代码执行CSV.open,文件就可以读取,each 会读取每一行。整个文件不需要一次在内存中,这是不可扩展的(尽管在新机器上它变得更加合理),如果你测试,你会发现使用 each 读取文件速度非常快,可能与读取它、解析它然后遍历解析的文件一样快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-29
      • 2015-03-12
      • 2014-04-17
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      相关资源
      最近更新 更多