我正在尝试使用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
答案 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