我有两个csv文件像下面.
CSV 1型
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
CSV 2型
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文件中的一列完全相同时,我知道如何合并这两个文件。但我的问题有点不同。CSV 1中的第4列可能包含CSV 2中的第2列。我想得到如下所示的CSV文件
最终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.**当CSV 1的第4列和第5列中的数据完全匹配时,它将返回该行,而不是第一个匹配项。
我完全不知道该怎么做。帮助做一部分也很好。任何建议都是非常感谢的。
PS-我知道csv文件中的数据应该用逗号分隔,但为了清晰起见,我更喜欢制表符,尽管实际数据是用逗号分隔的。
编辑:实际上,'main_data'可以在CSV 2的任何列中,而不仅仅是在column 2中。相同的'main_data'也可以在多行中重复,那么我想获得所有相应的行。
4条答案
按热度按时间llew8vvj1#
(g)awk的一种方式。
输出量
cidc1ykv2#
您是否考虑过使用pandas?如果您熟悉R,那么 Dataframe 应该非常简单。下面是您想要的:
请注意,我用逗号替换了制表符,并且用分号分隔。到目前为止,输出应该是:
使用左联接:
给出合并的第零列和第七列:
为了给予所需的输出,使用
CSV2
执行另一次合并(这次是外部连接):输出量:
您不必使用
**kw
作为关键字参数,我只是使用它来使所有内容水平放置。我让
read_table
和merge
来决定列名。如果您自己指定列名,则会得到更好看的输出。voj3qocg3#
由于合并的条件看起来很复杂,所以将数据加载到数据库中并使用SQL可能是值得的。
然后,您可以用SQL表达联接逻辑。您可以运行如下查询:
以下查询提供了所需的输出:
jmo0nnb34#
由于您最初要求Python提供一个解决方案,我想我会提供一个。最简单的解决方案是首先加载
CSV1
,然后使用它生成一个Map字典,以便在生成CSV2的输出时使用。如果我对输入文件的理解正确的话,只有
;
左边的值(如果有)。这可以通过使用split(';')
并取元素零来实现。如果没有;
,则元素零将是整个字符串。对mapper
的赋值只需遵循您定义的规则(仅在尚未存在时添加,* 当第4列和第5列匹配时 * 除外)。下面的代码将生成您请求的输出:
输出文件:
要解决'main_data can be in any column of CSV'修改问题,请使用以下代码:
这将搜索CSV2当前行中的每个条目,如果有匹配项(与原始Map器数据匹配),则将Map数据附加到该行。然后该行将像以前一样写入。