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

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 文件中添加标志?

提前致谢

sca*_*er2 5

我想出了两种将列附加到现有 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)