Dip*_*hal 0 csv ruby-on-rails ruby-on-rails-3
我已经有 CSV 文件,内容如下
a1 a2 a3
1 2 3
4 5 6
5 8 2
Run Code Online (Sandbox Code Playgroud)
现在,我想要什么,当我读取任何行时,我想在 csv 文件中添加一个标志,例如
a1 a2 a3 flag
1 2 3 1
4 5 6 1
5 8 2
Run Code Online (Sandbox Code Playgroud)
上面的flag为1表示该记录已插入到表中。
那么如何在 csv 文件中添加标志?
提前致谢
我想出了两种将列附加到现有 CSV 文件的方法。
方法 1 后期通过将文件读取到哈希数组中来合并新列,然后将列附加到每行的末尾。如果运行多次,此方法可能会出现异常。
require 'csv'
filename = 'test.csv'
# Load the original CSV file
rows = CSV.read(filename, headers: true).collect do |row|
row.to_hash
end
# Original CSV column headers
column_names = rows.first.keys
# Array of the new column headers
additional_column_names = ['flag']
# Append new column name(s)
column_names += additional_column_names
s = CSV.generate do |csv|
csv << column_names
rows.each do |row|
# Original CSV values
values = row.values
# Array of the new column(s) of data to be appended to row
additional_values_for_row = ['1']
values += additional_values_for_row
csv << values
end
end
# Overwrite csv file
File.open(filename, 'w') { |file| file.write(s) }
Run Code Online (Sandbox Code Playgroud)
方法 2 提前将新列合并到行哈希中。此方法的优点是它更紧凑,并且如果运行多次,可以避免重复的列名。此方法还可用于更改 CSV 中的任何现有值。
require 'csv'
filename = 'test.csv'
# Load the original CSV file
rows = CSV.read(filename, headers: true).collect do |row|
hash = row.to_hash
# Merge additional data as a hash.
hash.merge('flag' => '0')
# BONUS: Change any existing data here too!
hash.merge('a1' => hash['a1'].to_i + 1 )
end
# Extract column names from first row of data
column_names = rows.first.keys
txt = CSV.generate do |csv|
csv << column_names
rows.each do |row|
# Extract values for row of data
csv << row.values
end
end
# Overwrite csv file
File.open(filename, 'w') { |file| file.write(txt) }
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4790 次 |
最近记录: |