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

在Rails中读取无固定表头的XLSX/CSV文件并生成对应JSON

Rails 实现无固定表头的XLSX/CSV文件读取并转JSON

依赖准备

  • CSV 文件:Rails 内置 csv 库,无需额外安装
  • XLSX 文件:使用 roo gem 处理,先在 Gemfile 中添加:
    gem 'roo'
    
    执行 bundle install 完成依赖安装

CSV 文件处理实现

def csv_to_json(file_path)
  csv_data = CSV.read(file_path, headers: true)
  # 提取动态表头
  headers = csv_data.headers
  # 逐行转换为哈希并处理数据类型,最终转JSON
  csv_data.map do |row|
    row.to_hash.transform_values do |value|
      # 自动识别整数类型(如user_id)
      value.to_i.to_s == value ? value.to_i : value
    end
  end.to_json(indent: 2)
end

# 使用示例
# 处理第一份CSV(表头user_id、email、dob)
puts csv_to_json('path/to/first.csv')
# 输出结果:
# {
#   "user_id": 1,
#   "email": "example@example.com",
#   "dob": "2001-01-01"
# }

# 处理第二份CSV(表头user_id、username、email)
puts csv_to_json('path/to/second.csv')
# 输出结果:
# {
#   "user_id": 1,
#   "email": "example@example.com",
#   "username": "example"
# }

XLSX 文件处理实现

require 'roo'

def xlsx_to_json(file_path)
  xlsx = Roo::Excelx.new(file_path)
  # 取第一行作为动态表头
  headers = xlsx.row(1)
  data = []
  # 从第二行开始读取数据行
  (2..xlsx.last_row).each do |row_num|
    row = xlsx.row(row_num)
    # 表头与行数据配对成哈希
    row_hash = headers.zip(row).to_h
    # 统一处理数据类型转换
    row_hash.transform_values! do |value|
      value.to_i.to_s == value.to_s ? value.to_i : value
    end
    data << row_hash
  end
  data.to_json(indent: 2)
end

# 使用示例
puts xlsx_to_json('path/to/target.xlsx')

注意事项

  • 生产环境中建议通过 Rails 文件存储或云存储服务获取文件路径,避免硬编码
  • 可根据业务需求扩展数据类型处理逻辑(如日期格式化、空值处理)
  • 处理超大文件时,建议改用流式读取方式(CSV用CSV.foreach,XLSX用roo的流式API),防止内存溢出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:57:12