Ruby Rails CSV 文件数据 导入 导出 小记

lonely21475 · 2015年09月14日 · 最后由 dxf_28 回复于 2018年11月30日 · 7675 次阅读

最近因为业务需求接触到 CSV 文件导入导出,刚开始的时候零基础,遇到了一些小坑, 现在把自己的解决方案分享,帮助那些重复造轮子朋友可以更快的到达目的地

1、CSV 文件导入,首先创建一个 html 来获取文件 将 Form 数据类型指定为 multipart/form-data 否则文件不能传到后端

<form method="post" action="<%= csv_create_company_finances_path %>" enctype="multipart/form-data">
    <input class="form-control" type="file" name="data_file" accept=".csv">
    <button type="submit" class="btn btn-primary" style="width: 120px">提交</button>
</form>

2、定义一个方法来获取传过来的 CSV 文件 解析后的文件内容是单挑的数组,根据数据内容顺序自定义字段信息 第一次解析的时候,因为给的文件编码格式不是 UTF-8, 导致报各种错,请注意事例文件的编码格式

require 'csv'
  def csv_create
    csv_text = params[:data_file].tempfile
    csv = CSV.parse(csv_text, :headers => true)
    csv.each do |item|
      exp = Example.new
      exp.a = item[1]
      exp.b = item[2]
      exp.c = item[3]
      exp.d = item[4]
      exp.save!
    end
  end

3、讲数据导出为 CSV 文件存储 在 Model 创建一个方法

require 'csv'

  def self.to_csv(examples)
    Rails.logger.info '「我要开始导出数据了」'
    CSV.generate do |csv|
      csv << ['A','B','C','D']  #这是文件的headers
      examples.each do |item|
        csv << [item.a,item.b,item.c,item.d] #数据内容
      end
    end
  end

4、新建一个文件路径方法,将查询出的数据导出

require 'csv'

  def export_csv
   @examples  = Example.all
    respond_to do |format|
      format.csv { send_data Example.to_csv(@examples), filename:"Example.csv"}
    end
  end

关于2的编码,我们遇到的主要情景是 windows 用户导入或导出时 csv 会有乱码,所以后台根据用户系统选择了默认的 csv 编码,比如 linux 使用 UTF-8:UTF-8,windows 使用 GB18030:UTF-8,然后:读/写 CSV.open/foreach(encoding:'***'){}

刚好最近要做 csv 上传和下载。参考你的代码省了不少时间。多谢!

楼主你好,我跟着你的这个做 csv 文件的导入。到时我的数据格式不是标准的,我的模型里面有的字段这个文件里面没有,我跟着你这个做的时候可以添加一条记录,但是里面没有数据,,在网上找别人说可以写个脚本来做,由于还是新手。遇到好多问题,身边也没什么会 ruby 的,希望楼主帮忙指导一下或者提供点资料,谢谢(刚刚注册的用户,还不能提问)

judi0713 数据库已经有了,如何重写成 Rails 应用 提及了此话题。 03月21日 09:12

csv 遇到各种坑.....还没解决..

楼主,如何将新建的 csv 文件命名保存到 rails 项目中的制定文件路径下

需要 登录 后方可回复, 如果你还没有账号请 注册新账号