You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby如何读取两个CSV文件数据合并写入单个CSV文件

Ruby 合并两个CSV文件实现方案

原代码核心问题

  • 重复使用w+模式打开输出文件:该模式每次打开都会清空文件原有内容,后执行的函数会覆盖前一个函数写入的所有数据,是你缺失字段的核心原因
  • 手动分割CSV行:CSV字段可能包含内嵌逗号、引号等特殊字符,手动用split(',')处理容易出现解析错误,建议直接用Ruby标准库的CSV解析能力
  • 缺少数据拼接逻辑:两个文件的数据没有做行对齐或者关联键拼接就分别写入,自然无法得到合并后的完整行

改进后实现代码

require 'csv'

# 目标输出表头
OUTPUT_HEADERS = %w[id type code name_es name_ca name_en latin_name customer_id ecode]

def merge_csv
  # 第一步:提取pflname.csv所有ecode值,存入数组(跳过表头)
  ecodes = []
  CSV.foreach("pflname.csv", headers: true) do |row|
    # 取第三列作为ecode,CSV会自动处理多余引号,不需要手动转义
    ecodes << row[2]&.strip
  end

  # 第二步:读取spices.csv,逐行拼接ecode后写入输出文件
  CSV.open("plantas.csv", "w", headers: OUTPUT_HEADERS, write_headers: true) do |csv_out|
    CSV.foreach("spices.csv", headers: true).with_index do |spice_row, idx|
      # 拼接当前spice行和对应位置的ecode,行数不匹配时ecode默认空字符串
      merged_row = spice_row.fields + [ecodes[idx] || '']
      csv_out << merged_row
    end
  end
end

merge_csv

逻辑说明

  1. 提前一次性读取pflname.csv的所有ecode值存入数组,避免重复打开文件
  2. 打开输出文件仅一次,直接写入完整表头,避免覆盖问题
  3. 逐行读取spices.csv的内容,按行索引匹配对应ecode后拼接写入
  4. 全流程用标准库CSV处理文件,自动适配CSV格式的特殊字符,不需要手动处理引号、空格

内容的提问来源于stack exchange,提问作者Yung Sifilis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:54:01