3

私は現在、TableTexCompareと呼ばれるWindowsユーティリティを使用しています

このツールは2つのCSVファイルを取得して比較できます。2つのファイルのレコードが同じ順序で並べ替えられていない場合や、フィールドが同じ順序で配置されていない場合でも、比較できるのは良い点です。

そのため、次の2つのファイルで比較が成功します

(File1.csv)

FirstName,LastName,Age
Mona,Sax,30
Max,Payne,43
Jack,Lupino,50

(File2.csv)

FirstName,Age,LastName
Max,43,Payne
Jack,50,Lupino
Mona,30,Sax

私が探しているのは、コマンドラインから同じことを1つの違いだけで実行することです。つまり、File2.csvが次の場合(File1.csvのサブセット)、一方向のみで比較を実行したいと思います。 、比較は合格する必要があります

(File2.csv)

FirstName,Age,LastName
Jack,50,Lupino

プログラミング言語、専用のCLIツール、またはシェルスクリプト(awkの使用など)のいずれであるかは特に気にしません。私はJavaとGroovyの経験がありますが、最初の方向性を示したいと思います。

4

3 に答える 3

5

Pythonソリューションを提供できます:

import csv
with open("file1.csv") as f1, open("file2.csv") as f2:
    r1 = list(csv.DictReader(f1))
    r2 = csv.DictReader(f2)
    for item in r2:
        if not item in r1: 
            print("r2 is not a subset of r1!")
            break

これは実際にはPythonで必要なものよりも少し冗長です(ただし、理解しやすいです)。私は個人的にジェネレータ式を使用していました:

import csv
with open("file1.csv") as f1, open("file2.csv") as f2:
    r1 = list(csv.DictReader(f1))
    r2 = csv.DictReader(f2)
    if all(item in r1 for item in r2):
        print("r2 is a subset of r1")
于 2013-03-04T11:06:49.957 に答える
1

大文字と小文字を区別しない比較を行う余裕があり、File1.csv内で一致する必要のある重複がFile2.csv内になく、File1.csvに\\またはが含まれていない場合\"、必要なのは単純なFINDSTRコマンドだけです。

次に、File1.csvに表示されないFile2.csvの行を一覧表示します。

findstr /vxig:"File1.csv" "File2.csv"

File1.csvがFile2.csvのスーパーセットであるかどうかを示すだけでよい場合は、

findstr /vxig:"File1.csv" "File2.csv" >nul && (echo File1 is NOT a superset of File2) || (echo File1 IS a superset of File2)

厄介なFINDSTRバグがある場合を除いて、検索で大文字と小文字を区別する必要はありません。サイズが異なる大文字と小文字を区別するリテラル検索文字列が複数ある場合、一致を見つけることができない場合があります。大文字と小文字を区別しないオプションは、バグを回避します。複数のリテラル検索文字列を使用したこのFINDSTRの例で一致が見つからないのはなぜですか?を参照してください。詳細については。

\\File2.csvに含まれている場合、または\"FINDSTRがそれらをそれぞれおよびとして扱うため\、検索は正しく機能しません"WindowsFINDSTRコマンドの文書化されていない機能と制限は何ですか?を参照してください。詳細については。受け入れられた回答には、FINDSTRエスケープシーケンスを約半分下に説明するセクションがあります。

于 2013-03-04T12:22:11.283 に答える
1

q-データベースとしてのテキストを見ることができます。これにより、結合を含むcsvファイルでSQLを直接実行できます。これにより、比較を簡単に行うことができます。たとえば、特定の列を一致させて同等にすることや、一致しない行から特定の列を取得することなどが可能になります。

完全な開示-それは私自身のオープンソースツールです。

ハレルベン-アティア

于 2014-03-15T12:21:49.463 に答える