如何使用Ruby更改CSV文件的标头

时间:2015-11-05 19:46:03

标签: ruby csv

我正在尝试更改CSV文件的标头,但我只能更改数据行,而不是标题。

我试着查看其他示例,但是它们没有用。我一直在研究一些Ruby documentation,但它仍然没有用。

以下是我现在尝试做的事情:

input = File.open TestFile, 'r' #read
output = File.open TestFile, 'w' #write
CSV.filter input, output, :headers => true, :write_headers => true, :return_headers => true do |csv|
  csv << ["Test"] if row.header_row?
end

4 个答案:

答案 0 :(得分:1)

  

我正在尝试使用ruby脚本更改CSV文件的标题,

一般规则是:You cannot change what is already written to a file。您可以擦除文件并重新写入文件。您可以附加到文件。但是你无法改变已经写好的内容。

require 'csv'

input = File.open 'input.txt', 'r' #read
output = File.open 'output.txt', 'w' #write

CSV.filter input, output, :headers => true, :write_headers => true, :return_headers => true do |row|
  row << "Test" if row.header_row?
end

--output:--
$ cat input.txt
col1,col2
10,20
30,40
~/ruby_programs$ rm output.txt 
remove output.txt? y
~/ruby_programs$ ruby my_prog.rb 
~/ruby_programs$ cat output.txt
col1,col2,Test
10,20
30,40

答案 1 :(得分:0)

快速分析您正在做的事情:

您打开一个文件进行阅读:

input = File.open TestFile, 'r' #read

您打开同一个文件进行阅读 - 这会删除内容。

output = File.open TestFile, 'w' #write

你读了现在空的文件:

CSV.filter input, output, :headers => true, :write_headers => true, :return_headers => true do |csv|
  puts "I'm here" ## <- My addition to show you never in the loop.
  csv << ["Test"] if row.header_row?
end

可能的解决方案:

您必须定义不同的输入和输出文件并进行手动标题定义:

#Prepare some test data
TestFile = 'test.csv'
File.open(TestFile, 'w'){|f|
 f << <<csv
a;b;c
1;2;3
1;2;3
csv
}

require 'csv'
input = File.open TestFile, 'r' #read
output = File.open('x.csv', 'w') #write

output << "new a; new b;new b"
CSV.filter input, output, :headers => true, :write_headers => true do |row|
end

input.close
output.close
#You may delete the input file and rename output file

作为替代方案,您可以定义自己的标题:

CSV.filter( input, output, 
          :headers => true, #remove header from input
          :out_headers => [:xa,:xb, :xc], #define output header
          :write_headers => true, 
        )  do |row|
end

答案 2 :(得分:-1)

input = File.open TestFile, 'r' #read
output = File.open TestFile, 'w' #write

打开文件进行写入的行是截断它,以便当您将文件作为输入读取时,那里没有任何内容。

正如7stud在他的回答中所示,你需要有单独的输入和输出文件。

input = File.open 'input.txt', 'r' #read
output = File.open 'output.txt', 'w' #write

答案 3 :(得分:-1)

rows = CSV.open("input.csv").read
rows.shift
rows = new_headers << rows
CSV.open("output.csv", "w") { |csv| csv.write(rows) }

顺便说一句,如果你不想,你不必将它们写入输出文件,至少在这个例子中。