删除 CSV 文件中的空格
Posted
技术标签:
【中文标题】删除 CSV 文件中的空格【英文标题】:Removing whitespaces in a CSV file 【发布时间】: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
【问题讨论】:
【参考方案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 支持headers 和fields 的“转换器”,这样您就可以在数据传递到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
读取文件速度非常快,可能与读取它、解析它然后遍历解析的文件一样快。
【讨论】:
以上是关于删除 CSV 文件中的空格的主要内容,如果未能解决你的问题,请参考以下文章