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

Ruby 如何重新排列csv文件中列的顺序?,ruby,csv,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新手,所以如果我的代码不够理想,我愿意接受其

我正在尝试使用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
需要“csv”
acsv=CSV.read(“./foo.CSV”,{headers:true,return\u headers:false})
@headers=CSV.open(“./foo.CSV”,'r',:headers=>true).read.headers
#重新排列标题
临时索引=@headers[0]
@标题[0]=@headers[1]
@标题[1]=临时索引
#重新排列列
acsv.每行|
临时索引=行[0]
第[0]行=第[1]行
第[1]行=临时索引
结束
将“acsv是”
放置“#{acsv}”
#写标题的示例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试试:

需要“csv”
CSV.open('./foo reversed.CSV',wb')do | CSV|
读取('./foo.CSV',r')。每行|
csv试试:

需要“csv”
CSV.open('./foo reversed.CSV',wb')do | CSV|
读取('./foo.CSV',r')。每行|

csv您可以简化:

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
结合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
需要“csv”
CSV.open(“./bar.CSV”,“wb”)do | CSV|
CSV.read(“./foo.CSV”)。每个do |行|

csv您可以简化:

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
结合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
需要“csv”
CSV.open(“./bar.CSV”,“wb”)do | CSV|
CSV.read(“./foo.CSV”)。每个do |行|

csv还有另一种方法,通过将列转换为行,然后将
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
需要“csv”
csv=csv.read(“./foo.csv”,{headers:true,return\u headers:false})
csv=csv.to_a.转置
csv[0],csv[1]=csv[1],csv[0]
csv=csv.transpose
CSV.open(“./foo.CSV”,“wb”)do |行|

csv.each{| line | line这里有另一种方法,通过将列转换为行,然后将
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
需要“csv”
csv=csv.read(“./foo.csv”,{headers:true,return\u headers:false})
csv=csv.to_a.转置
csv[0],csv[1]=csv[1],csv[0]
csv=csv.transpose
CSV.open(“./foo.CSV”,“wb”)do |行|

csv.each{| line | line你的CSV文件是什么样子的?为什么你的CSV文件末尾有一个尾随逗号?@Cupcake我编辑了这个问题,它字面上说foo,bar,foobar…为什么你的CSV文件结尾有一个尾随逗号?哎呀,我想它不应该有尾随逗号。尾随逗号给了你一个额外的列,而你实际上没有。你能解决这个问题吗,或者你被他们困住了?你的CSV文件是什么样子的?为什么你的CSV结尾有一个尾随逗号?@Cupcake我编辑了这个问题,它的字面意思是foo,bar,foobar…为什么你的CSV结尾有一个尾随逗号?哎呀,我想它不应该有尾随逗号。尾随逗号给了你一个额外的列n你实际上没有。你能解决这个问题吗,还是你一直坚持?这是一个非常好的技术,我将在我的代码的下一个版本中实现这个想法。这个策略有好处(与其他答案相比)这是一项非常好的技术,我将在下一版本的代码中实现这一想法。与其他答案相比,这种策略的优点是可以轻松地对CSV文件中的任意列进行重新排序。