我正在尝试更改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
答案 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) }
顺便说一句,如果你不想,你不必将它们写入输出文件,至少在这个例子中。