csvファイル2の列1を読み取り、ファイル1の列2と一致します。テキストが一致する場合は、ファイル 1 の列 1 の値をファイル 2 に追加します。

csvファイル2の列1を読み取り、ファイル1の列2と一致します。テキストが一致する場合は、ファイル 1 の列 1 の値をファイル 2 に追加します。

ファイル1.csv

9,hello-world.com.,A,192.168.0.9
1,hello1-world.com.,A,192.168.0.1
2,hello2-world.com.,A,192.168.0.2
3,hello3-world.com.,A,192.168.0.3
4,hello4-world.com.,A,192.168.0.4
5,hello5-world.com.,A,192.168.0.5
6,hello6-world.com.,A,192.168.0.6
7,hello7-world.com.,A,192.168.0.7
8,hello8-world.com.,A,192.168.0.8

ファイル2.csv

hello4-world.com.,A,192.168.0.4
hello2-world.com.,A,192.168.0.2
hello7-world.com.,A,192.168.0.7

2つのcsvファイルがあり、file1には多くのデータがあり、file2にはデータが少なくなります。 file1でfile2の列1を見つける必要があります。一致するテキストにのみ追加する必要がある file1 から file2 までの最初の列の値が必要です。

出力には、新しい値で更新された別々のファイルまたはfile2が必要です。

予想出力:

4,hello4-world.com.,A,192.168.0.4
2,hello2-world.com.,A,192.168.0.2
7,hello7-world.com.,A,192.168.0.7

Pythonコードを試してみました。

#! /usr/bin/python

t = {}
address = {}

for lines in open("file2.csv"):
    columns = lines.strip().split(",")
    name = columns[0]
    t[name] = columns[1]
    address[name] = columns[2]
    
for lines in open("file1.csv"):
    columns = lines.strip().split(",")
    name = columns[1]
    try:
        print("{},{},{},{}".format(columns[0], name, t[name], address[name]))
    except KeyError:
        print("{},{},{},{}".format(columns[0], name, columns[2], columns[3]))

上記のコードを試しましたが、file1のすべての内容を出力にコピーしましたが、file2の一致内容のみが必要です。

よろしくお願いします。

ベストアンサー1

データが本当に単純な場合(フィールド内にカンマがなく、フィールド内に改行がなく、示した非常に単純な例外には何もありません)、Pythonスクリプトは実際には必要ありません。簡単な awk 1 行の操作を実行できます。

$ awk -F, 'NR==FNR{a[$1]; next} $2 in a' file2.csv file1.csv 
2,hello2-world.com.,A,192.168.0.2
4,hello4-world.com.,A,192.168.0.4
7,hello7-world.com.,A,192.168.0.7

これは、単に最初のファイルを読み込み(NR==FNR「フル入力行番号が現在のファイルの行番号と同じ」という意味で「最初のファイルを読み取るとき」を意味します)、最初のフィールドをaa[$1])の配列に保存してから2番目のファイルは、a配列内の2番目のフィールドを見つけることができるすべての行を印刷します。

次のようにすることもできます。

$ grep -Ff <(cut -d, -f1 file2.csv) file1.csv 
2,hello2-world.com.,A,192.168.0.2
4,hello4-world.com.,A,192.168.0.4
7,hello7-world.com.,A,192.168.0.7

ただし、これは file1 のどのフィールドに関係なく、file2 の最初のフィールド値と一致します。


重要な警告:csvファイルは非常に複雑な可能性があるため、データを完全に制御でき、最初の文の条件が常に満たされていることを保証できる場合(内部カンマなし、複数行フィールドなし)にのみ、この機能を使用してください。

おすすめ記事