在Ruby中,是否可以将CSV列作为块来操作?
例如我有以下的CSV:
H1,H2,H3
V11,V22,V33
V14,V25,V35
我想:
H1
和H3,H2
。H2
HX
醇>
我看到了操纵CSV的示例,但它们始终是逐行。
答案 0 :(得分:2)
csv_table = CSV.read(file_path_in, :headers => true)
csv_table.delete("header_name")
csv_table.to_csv # => The new CSV in string format
CSV::Table
documentation。
**更新了@ArupRakshit建议:
csv_table = CSV.read(file_path_in, :headers => true)
csv_array = csv_table.to_a
csv_array[0][0] = "HEADER_RENAMED" # Renaming the column 1
CSV.generate { |csv_out| csv_array.each { |array| csv_out << array } } # => The new CSV in string format
答案 1 :(得分:0)
我不确定这是否是最佳方式,只是很快就试过......
仅交换第2列和第3列的标题。
require "csv"
csv_text = File.read("original.csv")
original = CSV.parse(csv_text)
CSV.open("result.csv", "wb") do |csv|
trigger = 0 # to check if it's header or not
original.to_a.each do |row|
if trigger != 0
csv << ["#{row[1]}", "#{row[2]}"]
else
csv << ["#{row[2]}", "#{row[1]}"]
trigger = 1
end
end
end
正如 @Arup Rakshit 所述,转换为数组很有帮助。
答案 2 :(得分:0)
回答基于@ oscar的代码
$ cat a.rb
require "csv"
line_num=0
original = CSV.read("original.csv")
original.to_a.each do |row|
line_num += 1
if line_num == 1
puts "H3,HX"
else
puts row.values_at(2,1).join(',')
end
end
$ ruby a.rb
H3,HX
V33,V22
V35,V25