如何重新排列csv文件中列的顺序?

时间:2014-04-05 21:10:53

标签: ruby csv

我正在尝试使用ruby重新排序csv文件的列。

之前:

$ cat foo.csv 
foo,bar,foobar
1,2,3,
4,5,6,
7,8,9,

之后:

bar,foo,foobar
2,1,3,
5,4,6,
8,7,9,

不幸的是,当我写出文件时,我得到了额外的“,”这样的值:

bar,foo,foobar
"2,1,3,
","5,4,6,
","8,7,9,
"

任何人都可以帮我确定为什么额外的引号会出现在csv文件中吗?

我对ruby很新,所以如果我的代码不太理想,我会接受其他想法。

require 'csv' 

acsv = CSV.read("./foo.csv", {headers:true, return_headers:false})
@headers = CSV.open("./foo.csv", 'r', :headers => true).read.headers

# Rearrange headers
temp_index = @headers[0]
@headers[0]     = @headers[1]
@headers[1]     = temp_index

# Rearrange Columns
acsv.each do |row|
  temp_index = row[0]
  row[0]     = row[1]
  row[1]     = temp_index
end

puts "acsv is"
puts "#{acsv}" 

# Example to write headers http://stackoverflow.com/questions/15905985/how-to-write-columns-header-to-a-csv-file-with-ruby
newcsv = CSV.open("bar.csv", "wb", write_headers: true, headers: @headers) do |csv|
    csv << acsv
end

更新 删除了不必要的标头转换为headers_array

3 个答案:

答案 0 :(得分:4)

以下是另一种方法,您可以通过转置列将列转换为行,然后将foo行与bar行交换,然后再转置:

require 'csv'

csv = CSV.read("./foo.csv", { headers: true, return_headers: false })
csv = csv.to_a.transpose
csv[0],csv[1] = csv[1],csv[0]
csv = csv.transpose

CSV.open("./foo.csv", "wb") do |lines|
  csv.each { |line| lines << line }
end

答案 1 :(得分:2)

你可以简化:

require 'csv'

result = []

CSV.read("./foo.csv").each do |line|
  result << [line[1], line[0], line[2]]
end

CSV.open("./bar.csv", "wb") do |csv|
  result.each{ |line| csv << line }
end

由于CSV文件末尾有额外的逗号,因此有一些空列。应该是:

foo,bar,foobar
1,2,3
4,5,6
7,8,9

结合Alex的解决方案:

require 'csv'

CSV.open("./bar.csv", "wb") do |csv|
  CSV.read("./foo.csv").each do |line|
    csv << [line[1], line[0], line[2]]
  end
end

答案 2 :(得分:1)

尝试:

require 'csv'

CSV.open('./foo-reversed.csv','wb') do |csv|
  CSV.read('./foo.csv','r').each do |row|
    csv << row.reverse
  end
end