如何在现有CSV文件中插入列

时间:2014-08-07 07:14:27

标签: ruby-on-rails ruby-on-rails-3 csv

我已经有CSV文件,内容如

a1    a2     a3
1     2      3
4     5      6
5     8      2

现在,我想要什么,当我读取任何行时,我想在csv文件中添加一个标志,如

a1    a2     a3 flag
1     2      3   1
4     5      6   1
5     8      2    

上述标志1表示此记录已插入表格中。

那么如何在csv文件中添加标志?

提前致谢

3 个答案:

答案 0 :(得分:3)

您需要使用其他列编写新的CSV文件,然后用新文件替换原始文件。

答案 1 :(得分:3)

我提出了两种方法将列附加到现有的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) }

方法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) }

答案 2 :(得分:0)

不确定是否可以在同一个文件中追加新列,但是可以在csv中添加新行:

CSV.open('your_csv.csv', 'w') do |csv|
  customers.array.each do |row|
    csv << row
  end
end 

希望这有帮助。