2015-11-05 36 views
1

我試圖更改CSV文件的標頭,但是我只能更改數據行,而不是標頭。如何使用Ruby更改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 
+1

您正在打開'TestFile'來讀取,然後寫入。你不能那樣做。只要你嘗試打開一個文件來寫就會被截斷。你必須寫入一個單獨的文件。 –

+0

請在重寫標題後添加您正在閱讀的CSV文件的最小示例,以及該文件的示例。不要讓我們自己創造;我們需要全部使用相同的沙盒玩具。請閱讀「[問]」。 –

回答

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

它沒有工作。我只是用空值替換了所有的單元格,並沒有更改標題。 – FyreeW

+0

@FyreeW,複製我的程序,運行它...它的工作原理。 – 7stud

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

的頭部只是第一行,所以....

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

順便說一句,你不必將它們寫入到輸出文件,如果你不想,至少在這個例子中。

+0

我打算使用CSV類,謝謝 –

+0

我也有數據添加到單元格中,並已有一個方法來做到這一點。我如何將創建標題的位置和創建標題的位置組合在一起,然後用數據填充單元格? – FyreeW