【问题标题】:How to merge multiple CSV files into one, with only unique values如何将多个 CSV 文件合并为一个,只有唯一值
【发布时间】:2014-12-08 03:42:30
【问题描述】:

我在一个目录中有多个 CSV 文件,它们都具有相同的数据模型,其中一些是重复的整体。

file1.csv:

1       joe      red
2       bill     blue 
3       bob      green

file2.csv:

3       bob      green
4       mary     white 
5       jim      yellow

file3.csv:

5       jim      yellow
6       lauren    pink  
7       george    purple

我的目标是生成包含所有唯一值的单个 CSV 文件。

到目前为止,我的代码是这样的:

  1. 使用连接 iTerm2 中的所有文件

     cat *.csv > combined.csv
    
  2. 还有这个脚本:

    require 'csv'
    
    File.open("all_unique_rows.csv", "w+") { 
    
      |file| file.puts File.readlines("combined.csv").uniq 
    
    }
    

但是,我希望能够从单个 Ruby 脚本中完成所有这些操作,但我只是不确定如何使用 Ruby 将“combined.csv”文件变成一个巨大的文件。

【问题讨论】:

  • 这些不是 CSV 文件。它们很可能是固定宽度的,但可能是 TSV,尽管您的第三个样本的最后两条记录的列倾斜。

标签: ruby csv


【解决方案1】:

如果您的记录是真正的重复,我不会在 Ruby 中这样做。取而代之的是,利用操作系统中为此而设计的现有工具:

cat *.csv | sort -u >unique.csv

完成后,“unique.csv”将包含唯一记录。

如果您坚持用 Ruby 编写它,那么请利用内置方法或类。这是一种未经测试的方法:

require 'set'
unique = Set.new
Dir.glob('*.csv') do |f|
  File.foreach(f) { |l| unique << l }
end
File.write('unique.csv', unique.sort.join)

这可以创建唯一的输出,因为集合不允许重复。

另一种方法是执行以下操作:

unique = []
Dir.glob('*.csv') do |f|
  unique += File.readlines(f)
end
File.write('unique.csv', unique.sort.uniq.join)

虽然 Ruby 可以 做到这一点,但使用操作系统来处理它更具可扩展性。 YMMV。


我尝试运行 cat *.csv |在 OS 中排序 - u > unique.csv,但最终将一些值放错列中。

我在磁盘上创建了三个文件:

$猫文件1.csv 1乔红 2 钞票蓝色 3 鲍勃·格林 $猫文件2.csv 3 鲍勃·格林 4 玛丽·怀特 5吉姆黄 $猫文件3.csv 5吉姆黄 6 劳伦粉红色 7乔治紫

运行cat *.csv | sort -u &gt;unique.csv 并查看生成的文件显示:

$猫独特的.csv 1乔红 2 钞票蓝色 3 鲍勃·格林 4 玛丽·怀特 5吉姆黄 6 劳伦粉红色 7乔治紫

重复项被删除,文件与您提供的输入样本相同。您的“file3.csv”在最后一行显示一个额外的空间,将最右边的列推过去。

注意:您的文件是不是 CSV 文件。 CSV 代表“逗号分隔值”,您的列之间没有逗号。可能您最初有 TSV(“制表符分隔值”),Ruby 的 CSV 类可以读取和写入,或者您有固定宽度的列并以某种方式添加了额外的空间。使用正确的术语并始终如一地使用非常重要,尤其是在提问时。

【讨论】:

  • 我尝试在 OS 中运行 cat *.csv | sort - u &gt; unique.csv,但最终将一些值放错列中。
  • 如果它们在错误的列中,请检查输入文件。操作系统命令中没有任何内容可以更改列。这些命令仅适用于完整的行。
  • unique &lt;&lt; l 将一行推到数组的末尾。
猜你喜欢
  • 2014-05-17
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多