我有两个csv文件,如下所示。
CSV版
data13 data23 d main_data1;main_data2 data13 data23
data12 data22 d main_data1;main_data2 data12 data22
data11 data21 d main_data1;main_data2 data11 data21
data3 data4 d main_data2;main_data4 data3 data4
data52 data62 d main_data3 data51 data62
data51 data61 d main_data3 main_data3 data61
data7 data8 d main_data4 data7 data8
CSV2型
id1 main_data1 a1 a2 a3
id2 main_data2 b1 b2 b3
id3 main_data3 c1 c2 c3
id4 main_data4 d1 d2 d3
id5 main_data5 e1 e2 e3
现在我的问题是,当两个文件中的一列完全相同时,我知道如何合并两个CSV文件。但我的问题有点不同。CSV1的第4列可能包含CSV2的第2列。我想得到一个CSV文件如下
最终的
id1 main_data1 a1 a2 a3 data13
id2 main_data2 b1 b2 b3 data3
id3 main_data3 c1 c2 c3 main_data3
id4 main_data4 d1 d2 d3 data7
id5 main_data5 e1 e2 e3
其中:
1。它匹配来自两列的数据,并从第一个匹配项获取相应的行,然后写入csv文件。
2.如果没有匹配项,它可以将FINAL_CSV中的最后一列留空,或写“NA”或类似的任何内容。
3.当CSV1的第4列和第5列中的数据完全匹配时,它将返回该行而不是第一行。
我完全不知道该怎么做。帮我做一部分也很好。如有任何建议,我们将不胜感激。
PS-我知道csv文件中的数据应该用逗号分隔,但为了清晰起见,我更喜欢使用制表符,尽管实际数据是用逗号分隔的。
编辑:实际上,“主数据”可以在CSV2的任何列中,而不仅仅是在第2列中。同样的“main_data”也可以在多行中重复,然后我想得到所有对应的行。
由于合并的条件似乎很复杂,因此将数据加载到数据库并使用SQL可能是值得的。在内存中使用SQLite可以这样做(假设数据是逗号分隔的)
然后可以在SQL中构造连接逻辑。您可以运行以下查询:
以下查询提供所需的输出:
你考虑过用pandas吗?如果您熟悉R,那么数据帧应该非常简单。以下是您想要的:
注意,我用逗号替换了制表符,并用分号分隔。目前的产出应该是:
使用左连接:
给出合并的第0列和第7列:
要按您的需要提供输出,请使用
CSV2
执行另一个合并(这次是外部连接):输出:
不必对关键字参数使用
**kw
。我只是用它来让所有的东西水平放置。我让
read_table
和merge
决定列名。如果您自己指定列名,您将获得更美观的输出。用锥子的方法。
输出
相关问题 更多 >
编程相关推荐