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

spu*_*der 2 ruby csv

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

前:

$ cat foo.csv 
foo,bar,foobar
1,2,3,
4,5,6,
7,8,9,
Run Code Online (Sandbox Code Playgroud)

后:

bar,foo,foobar
2,1,3,
5,4,6,
8,7,9,
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我写出文件时,我得到了额外的“,”值,如下所示:

bar,foo,foobar
"2,1,3,
","5,4,6,
","8,7,9,
"
Run Code Online (Sandbox Code Playgroud)

谁能帮我确定为什么 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
Run Code Online (Sandbox Code Playgroud)

更新 删除了标题到 headers_array 的不必要转换

小智 5

这是另一种方法,通过转置列将列转换为行,然后将行foobar行交换,然后再次转置:

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
Run Code Online (Sandbox Code Playgroud)