【问题标题】:Parse unique values from CSV从 CSV 解析唯一值
【发布时间】:2019-02-18 21:24:15
【问题描述】:

我有file.csv:

user,name
1,Jim
1,Jim
2,Michael
3,Scott
4,Dwight
4,Dwight
5,Pam

我只想要文件中的唯一条目之一,然后将其导入。我渴望:

user,name
1,Jim
2,Michael
3,Scott
4,Dwight
5,Pam

我可以解析 CSV 并将其导入我的数据库。

CSV.foreach("file.csv", :headers => true).each do |row|
  # do stuff to ignore dupes

  # doing stuff to import to db
end

我假设我需要在解析时跟踪 id,但我不确定下一步是什么。

【问题讨论】:

  • 对于您的示例,请显示您“希望”构建的 Ruby 对象(字符串?数组?散列?CSV 文件?)。标题是否相关?什么是独一无二的?号码?线条?该文件是否可以在一行包含“5,Pam”而在另一行包含“5,Lucy”?
  • 幸好@CarySwoveland id 永远属于同一个名字
  • 谢谢,但这只是我提出的几个问题之一。在澄清问题时,最好编辑问题而不是在 cmets 中详细说明,因为并非所有读者都阅读所有 cmets。

标签: ruby csv parsing


【解决方案1】:

可以试试:

CSV.read("file.csv", :headers => true).uniq(&:last).each do |row|
   print row
end

输出:

1,Jim
2,Michael
3,Scott
4,Dwight
5,Pam

【讨论】:

  • 在我看来,id 和名称匹配。因此uniq 没有参数也应该没问题。
【解决方案2】:

当我看到这样的任务时,我总是在想,看在上帝的份上,为什么要在这里滥用 CSV?

input = 'user,name
1,Jim
1,Jim
2,Michael
3,Scott
4,Dwight
4,Dwight
5,Pam'
#⇒ "user,name\n1,Jim\n1,Jim\n2,Michael\n3,Scott\n4,Dwight\n4,Dwight\n5,Pam"
input.split[1..-1].map { |line| line.split(',').last }.uniq
#⇒ ["Jim", "Michael", "Scott", "Dwight", "Pam"]

或者,使用索引:

input.split[1..-1].uniq
#⇒ ["1,Jim", "2,Michael", "3,Scott", "4,Dwight", "5,Pam"]

【讨论】:

  • 如果是真的 CSV,条目可能看起来像126,"Arthur Dent"127,"Prefect, Ford",在这种情况下拆分不会产生所需的结果。
  • @user1934428 是的,我知道这一点。
【解决方案3】:

我不确定您是否可以真正在开头解析。但是是的,您的问题有解决方案

  1. 读取 csv 文件
  2. 将 csvData 更改为数组格式
  3. 应用数组的 uniq 特性将删除重复。

    require 'csv'
    csvData = CSV.read('./fileName.csv', :headers => true)
    csvData.to_a.uniq!
    

现在您可以在不更改初始文件的情况下唯一值

【讨论】:

    【解决方案4】:

    鉴于我的问题,我想通了。也许不是最佳实践,但这似乎适合我的需要。

    previous_user = nil
    
    CSV.foreach("file.csv", :headers => true).each do |row|
      # do stuff to ignore dupes
      current_user = row['user']
    
      next if current_user == previous_user
    
      # doing stuff to import to db
      previous_user = current_user
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 2018-07-20
      • 2015-07-21
      相关资源
      最近更新 更多