【问题标题】:How to omit empty rows using last_row in Roo Rails如何在 Roo Rails 中使用 last_row 省略空行
【发布时间】:2020-02-19 08:55:46
【问题描述】:

我有一个members 的电子表格,设计如下:

我的目标是上传一些列并排除其他列。在这种情况下,我希望只上传nameageemail 并排除其他。我已经能够使用slice 方法实现这一点,如下所示:

def load_imported_members
    spreadsheet = open_spreadsheet
    spreadsheet.default_sheet = 'Worksheet'
    header = spreadsheet.row(1)
    (2..spreadsheet.last_row).map do |i|
      row = Hash[[header, spreadsheet.row(i)].transpose]
      member = Member.find_by_id(row["id"]) || Member.new
      member.attributes = row.to_hash.slice("id", "name", "age", "email")
      member
    end
  end

问题是last_row 考虑到最后一行 (13) 之前的所有行,并且由于表单上有验证,因此由于空行导致数据丢失而出现错误(不应该考虑)。有没有办法像我一样只上传特定的列,但仅限于有数据的行?

【问题讨论】:

    标签: csv ruby-on-rails-5 roo


    【解决方案1】:

    您可能希望像这样examplemap 调用链接到reject 过滤器

    您可能只需将map 行更改为此行(假设缺失的行都与上面的行类似): (2..spreadsheet.last_row).reject{|i| spreadsheet.row(i)[0] }.map do |i|

    这是假设空白行返回为 nil,并且空白行将始终将所有四个所需字段都保留为空白,如图所示。 reject 调用测试以查看 id 列 spreadsheet.row(i)[0] 是否为 nil,如果是,则从提供给 map 的列表输出中拒绝该项目

    【讨论】:

    • 感谢@randall-coding,但是,它仍然没有拒绝空白行;-(
    • 有什么想法吗?仍然无法破解它。提前致谢
    【解决方案2】:

    感谢您提出这个问题。我从这个问题中学到了一些东西。

    我已将您的答案列入候选名单 [注意:使用 'ROO' gem]

    def load_imported_members(member)
      spreadsheet = open_spreadsheet(member)
      spreadsheet.each do |records|
      record = @spreadsheet ? Hash[[@header, @spreadsheet.row(records)].transpose] : Hash[records] # transpose for xlsx records and 
      attributes =  {id: record['id'], name: record['name'], email: record['email'], age: record['age']}
      member_object = Member.new(attributes)
      if member_object.valid?
        if Member.find(attributes[:id])
          Member.find(attributes[:id]).update(attributes)
        else
          member_object.save
        end
      end
     end
    end
    

    您可以使用 Roo gem 解析您上传的文件。

    def self.open_spreadsheet(member)
    case File.extname(member.file.original_filename)
    when ".csv" then
      Roo::CSV.new(member.file.expiring_url, csv_options: {headers: true, skip_blanks: true, header_converters: ->(header) { header.strip }, converters: ->(data) { data ? data.strip : nil }})
    when ".xlsx", ".xls" then
      @spreadsheet = Roo::Spreadsheet.open(member.file.expiring_url)
      @header = @spreadsheet.row(1)
      (2..@spreadsheet.last_row)
     end
    end
    

    这里我使用了 s3 上传的 url,即 expiring_url。希望这会有所帮助。我没有测试过。抱歉,小错误。

    如果您对姓名、电子邮件和年龄使用了验证。这肯定会帮助你..

    【讨论】:

    • 感谢@rajkumar 的回答。您的答案是否在标题行中?对不起,我是初学者,但我明白你的逻辑
    • 不。在这里,我们不会担心标题 bcoz 我们提到的标题为 true。
    • 感谢@rajkumar,我觉得快到了。如果我想从 Excel (xlsx) 导入怎么办..如何进行解析?
    • 我已经更新了 xlsx。这将有助于@adamvanbart
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2021-05-07
    相关资源
    最近更新 更多