删除 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 文件中的空格的主要内容,如果未能解决你的问题,请参考以下文章

删除 Spark 数据框中的空格时出错 - PySpark

上传CSV文件如何删除多余的空格[重复]

如何使用python删除csv文件中逗号前后的空格?

无法从带有Pandas的CSV标头中删除空格

使用 spark 从 csv 文件中删除所有特殊字符

cmd去除csv首行