2014-04-05 125 views
1

我想用ruby重新排序csv文件的列。如何重新排列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

您的CSV文件是什么样子的?为什么你的CSV在最后有一个尾随逗号? –

+0

@Cupcake我编辑了这个问题,它字面上写着foo,bar,foobar ... – spuder

+0

为什么你的CSV在最后有一个尾随的逗号? –

回答

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 

并且有一些空列,由于t他在CSV文件末尾附加逗号。应该是:

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

与亚历克斯的解决方案相结合:

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 
1

尝试:

require 'csv' 

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

这里的另一种方式,你可以做到这一点,通过旋转列成行通过转它们,然后用bar行调换foo行,然后再次调换:

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 
+0

这是一个非常好的技术,我将在我的代码的下一个版本中实现这个想法。 – spuder

+0

这个策略有一个好处(与其他答案相比),它可以轻松地重新排列包含许多列的CSV文件中的任意列。 – Dennis