Ruby,CSV操纵列(删除,重新排序,重命名)

时间:2015-01-09 11:26:42

标签: ruby csv

在Ruby中,是否可以将CSV列作为块来操作?

例如我有以下的CSV:

H1,H2,H3
V11,V22,V33
V14,V25,V35

我想:

  1. 删除列H1
  2. 将列重新排序为H3,H2
  3. H2
  4. 重命名列HX

    我看到了操纵CSV的示例,但它们始终是逐行

3 个答案:

答案 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