【问题标题】:How to find difference in csv record如何找到csv记录中的差异
【发布时间】:2010-10-29 20:28:57
【问题描述】:

是否有算法或类似 diff 的实用程序来查找两个 csv 文件之间的差异? 示例:

file1
-------
key1,value1
key2,value2
key3,value3
key5,value5
key7,value7

file2
-------
key1,value1
key3,value3
key4,value4
key5,value5
key6,value6

使用这个类似 diff 的实用程序,它将输出 3 种类型的记录:

  1. 仅存在于 file1 中的记录 (file1 减去 file2 的设置操作)
  2. 仅存在于 file2 中的记录(file2 减去 file1 设置操作)
  3. file1 和 file2 中都存在的记录(相交集操作)

【问题讨论】:

  • 不知道有没有,但是用perl写这样一个工具只需要30分钟左右:)

标签: perl csv shell diff


【解决方案1】:

diff可以为所欲为..

diff file1.csv file2.csv --old-line-format="< %L" --new-line-format="> %L" --unchanged-line-format="= %L"

【讨论】:

  • 我认为这确实是我可以使用的东西,在一个命令中我得到了所有的差异。
  • 我要补充一点,您应该首先使用 sort 命令对这两个 CSV 文件进行排序。我还要补充一点,如果您的 CSV 有任何多行行,那么这不是 100% 可靠的,在这种情况下,您需要使用 Text::xSV 正确解析文件,将键记录到哈希中并将它们与 List::Util 和/ 或 List::MoreUtil.
【解决方案2】:

【讨论】:

    【解决方案3】:

    看看http://sourceforge.net/projects/csvdiff/

    csvdiff 是一个 Perl 脚本,用于将两个 csv 文件与 选择分隔符的可能性。差异将显示如下: “记录 999 中的 XYZ 列”是不同的。在此之后,实际和 将显示此列的预期结果。

    【讨论】:

      【解决方案4】:

      您可以使用 unix 'join' 命令来执行此操作。它在 Cygwin for Windows 中也可用。

      例子:

      $ join -t ',' -v 1 file1 file2
      key2,value2
      key7,value7
      $ join -t ',' -v 2 file1 file2
      key4,value4
      key6,value6
      $ join -t ',' file1 file2
      key1,value1,value1
      key3,value3,value3
      key5,value5,value5
      

      【讨论】:

      • 不过,当您的 CSV 中有引号逗号时,两者都会中断。
      【解决方案5】:

      Open Source DiffKit 能够做到这一点:

      www.diffkit.org

      【讨论】:

        【解决方案6】:

        您可以查看我的 FOSS CSV 流编辑器 CSVfix,它可以通过 join 命令执行您想要的操作 - 无需编程。

        【讨论】:

          【解决方案7】:

          您可以在 Perl 中使用哈希。将每个文件读入一个单独的哈希,类似于

          my %File1 = ();
          my %File2 = ();
          # Filehandles FP1 and FP2 is opened for read
          while (<FP1>) {
              if (/^([^,]+),(.+)$/) {
                  my ($key, $value) = ($1, $2);
                  $File1{$key} = $value;
              }
          }
          # Repeat for FP2
          

          要打印出结果,您可以遍历哈希并检查键/值是否相同、不同或以各种方式丢失。示例:

          for my $key (keys %File1) {
              if (defined($File1{$key}) && defined($File2{$key}) {
                  print("$key exists in both files\n");
              } elsif (defined($File1{$key})) {
                  print("$key exists only in file1\n");
              }
          }
          # Repeat for %File2
          

          【讨论】:

            【解决方案8】:

            使用SQLite 的示例怎么样?

            DROP TABLE 'file1';
            DROP TABLE 'file2';
            
            CREATE TABLE 'file1' (
                key_field VARCHAR primary key,
                value_field VARCHAR
            );
            
            CREATE TABLE 'file2' (
                key_field VARCHAR primary key,
                value field VARCHAR
            );
            
            
            .bail off
            .separator ,
            .import file1.csv file1
            .import file2.csv file2
            
            .output stdout
            .header on
            
            SELECT col1 AS 'In file1.csv, not in file2.csv' FROM (
                SELECT file1.key_field AS col1,
                       file2.key_field AS col2 
                FROM file1 LEFT OUTER JOIN file2
                ON file1.key_field == file2.key_field
            ) 
            WHERE col2 IS NULL
            ;
            
            SELECT col2 AS 'In file2.csv, not in file1.csv'FROM (
                SELECT file1.key_field AS col1,
                       file2.key_field AS col2
                FROM file2 LEFT OUTER JOIN file1
                ON file2.key_field == file1.key_field
            ) WHERE col1 IS NULL
            ;
            
            SELECT file1.key_field AS 'In both file1.csv and file2.csv'
                FROM file1 INNER JOIN file2
                WHERE file1.key_field == file2.key_field
            ;
            

            这是输出:

            C:\Temp> sqlite3 test.db < t.sql
            In file1.csv, not in file2.csv
            key2
            key7
            In file2.csv, not in file1.csv
            key4
            key6
            In both file1.csv and file2.csv
            key1
            key3
            key5
            

            【讨论】:

              猜你喜欢
              • 2013-11-26
              • 2021-04-08
              • 2023-04-09
              • 2019-12-07
              • 1970-01-01
              • 1970-01-01
              • 2021-01-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多