我有两个 TSV(制表符分隔值)文件——file_A.txt
以及file_B.txt
file_A.txt
包含两列 -- A_ID
,A_Name
file_B.txt
包含 4 列 -- B_ID1
, B_Name1
, B_ID2
,B_Name2
需要遍历每个A_ID
,如果匹配B_ID1
或,则相应地B_ID2
替换B_Name1
或。B_Name2
A_Name
我正在寻找一种有效的方法,因为file_B
只有几百 MB。
有什么建议吗?
答案1
假设您想要 file_B.txt 格式的替换,正如 Spike 建议的那样,像 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
创建一个临时文件。