Ruby - 将一列中包含的excel数据分成单独的列

时间:2017-02-05 03:39:18

标签: ruby regex csv delimiter comma

我正在尝试使用Ruby来操作一些excel数据,但我给出的.csv文件将所有数据放在一列中。

数据的标题和值以逗号分隔,但它们包含在第一列中。 此外,第一列中的某些值的文字被引号括起来,引号内有逗号。

有没有办法将第一列中的数据分成带有Ruby的单独列?

我知道你可以在excel中执行此操作,但我希望能够在Ruby中执行此操作,因此我不必手动更正每个.csv文件。

我在下面列出了.csv文件的示例。

enter image description here

所需的输出是:

{:header 1 => integer,
:header 2 => text,
:header 3 => "this text, has a comma within the quote"
:header 4 => integer} 

我很感激帮助。

1 个答案:

答案 0 :(得分:1)

这是一种粗略的方法:

require 'csv'                                                                                                                                           
result = []                                                                       

csv = CSV.read('./file.csv')                                                      
headers = csv.shift                                                               
csv.each do |l|                                                                   
  hash = {}                                                                       
  hash[headers[0]] = l[0]                                                         
  hash[headers[1]] = l[1]                                                         
  hash[headers[2]] = l[2]                                                         
  hash[headers[3]] = l[3]                                                         
  result << hash                                                                  
end                                                                               

p result

[{"header 1"=>"integer",
  "header 2"=>"text",
  "header 3"=>"this text, has a comma within the quote",
  "header 4"=>"integer"},
 {"header 1"=>"integer",
  "header 2"=>"text",
  "header 3"=>"this text, has a comma within the quote",
  "header 4"=>"integer"}]

这当然假设每行有4个值。

编辑:以下是将结果实际写入文件的示例:

CSV.open('./output.csv', 'wb') do |csv|                                           
  result.each do |hash|                                                           
    temp = []                                                                     
    hash.each do |key, value|                                                     
      temp << "#{key} => #{value}"                                                
    end                                                                           
  csv << temp                                                                   
  end                                                                             
end