大容量ファイルの文字列の置き換え

大容量ファイルの文字列の置き換え

TSVが2つあります(タブ区切り値) 文書file_A.txtfile_B.txt

file_A.txt2つの列が含まれています - A_IDA_Name

file_B.txt4つの列(B_ID1、、、、B_Name1B_ID2を含みます。B_Name2

それぞれを繰り返す必要があり、A_ID一致する場合、またはB_ID1それに応じてB_ID2交換する必要がありますB_Name1B_Name2A_Name

file_B数百MBで効率的な方法を探しています。

どんな提案がありますか?

答え1

Spikeが提案したようにfile_B.txt形式を置き換える場合は、sqliteなどの軽量データベースがこれを実行できます。

次のコードは file_A.txt と file_B.txt を一時メモリ内データベースに読み込み、結果を TSV ファイルに出力します。MODIFIED-file_B.txt

sqlite3 -separator $'\t' << EOF  > MODIFIED-file_B.txt
CREATE TABLE a ( id INTEGER PRIMARY KEY, name );
.import file_A.txt a
CREATE TABLE b (id1 INTEGER,name1 TEXT,id2 INTEGER,name2 TEXT);
.import file_B.txt b
SELECT b.id1,
       ifnull((SELECT name from a WHERE a.id=b.id1),b.name1),
       b.id2, 
       ifnull((SELECT name from a WHERE a.id=b.id2),b.name2)
FROM b;
EOF

これは各ファイルを別々のテーブルに読み込み、利用可能な場合は代替Aを使用してbテーブルを出力し、そうでない場合は元のB_nameを返します。

メモリ使用量が問題の場合は、ファイル名を使用して実行できます(sqlite3 -separator $'\t' temporary.db一時ファイルの作成など)。

関連情報