在Rails中读取无固定表头的XLSX/CSV文件并生成对应JSON
Rails 实现无固定表头的XLSX/CSV文件读取并转JSON
依赖准备
- CSV 文件:Rails 内置
csv库,无需额外安装 - XLSX 文件:使用
roogem 处理,先在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
相关产品推荐
相关产品推荐

