如何比较两个CSV文件及其多个字符串,并在满足条件时将其合并为一个?

5us2dqdw  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(124)

日安先生们女士们
我有两个主文件(我们称它们为one.csvtwo.csv)和一条指令,用于解析它们并将它们合并到特定目录结构下的多个文件中。我设法完成了它的第一部分,并构建了一个包含底层文件的目录结构。我唯一不能靠自己完成的就是我的第二部分,也是最后一部分。现在我将模拟两个CSV文件的相关内容:

one.csv:

  1. ID、状态、日期、资产、频率
    1.4815162342,开放,29/02/1842,9765,每月
    1.......这是什么?

two.csv:

1.服务、说明、ID、属性、活动

  1. IDR,传导,4815162342,完成,THEONETHATGOTAWAY_01
  2. IDR,指挥,4815162342,Todo,THEONETHATGOTAWAY_02
  3. IDR,传导,4815162342,Todo,THEONETHATGOTAWAY_03
    NOTE: The first line of both files, as it usually goes, is constant as it represents column name.
    我设法做的部分是解析**one.csv*,并以正确的格式将其写入多个文件(file01.csv、file02.csv、file03.csv等),每个文件都包含一个列名和从第2行开始的相应值;像这样:

file01.csv:

1.电话:4815162342**
1.状态:,打开
1.日期:1842年2月29日
1.资产:,9765
1.频率:每月

  • EOF*

我脑子里拒绝成功的是,在解析one.csv并将其写入文件后,再次打开每个文件,读取4815162342(作为示例)。在每个文件中它都不同,但它的位置显然是相同的),然后在two.csv* 中查找它,如果它在一行中匹配,则将该行的第4个元素(THEONETHATGOTAWAY_xx)追加到file01.csv**;像这样:

file01.csv:

1.电话:4815162342**
1.状态:,打开
1.日期:1842年2月29日
1.资产:,9765
1.频率:每月
1.Theonethatgaway_01
1.Theonethatgaway_02
1.酒店THEONETHATGOTAWAY_03

  • EOF*

这最后一个file01.csv是我的目标。

目前为止我尝试的是:

为了尝试比较两个文件是否具有相同的ID,如果成功则打印,我尝试:

...
directory = '/home/user/work/'

with open(directory + 'one.csv', 'r') as one, open(directory + 'two.csv', 'r') as two:
    
    # One:
    sheetOne = csv.reader(one, delimiter=';')
    titleOne = next(sheetOne)     # First row as constants (ID,Status,Date,Asset,Frequency)

    # Two:
    sheetTwo = csv.reader(two, delimiter=',')

    for rowOne in sheetOne:
        for rowTwo in sheetTwo:
            if rowTwo[2] == rowOne[0]:     # Check if ID in one.csv row is same as ID in two.csv row
                print("Equal: " + rowTwo[2] + "&" + rowOne[0])
  • EOF*

而不是print("Equal: " + rowTwo[2] + "&" + rowOne[0])

with open(directory + "output/" + rowOne[*] + "/" + rowOne[*].capitalize() + "/" + rowOne[*] + ".csv", 'a') as f_2:
    f_2.write(rowTwo[4] + ";")

我就不会再做了。
在这一点上我非常绝望。一旦我找到答案,答案可能会非常明显。我猜这是不对的

for rowOne in sheetOne:
        for rowTwo in sheetTwo:
            if rowTwo[2] == rowOne[0]:     # Check if ID in one.csv row is same as ID in two.csv row

我很肯定其他答案不会满足我的具体需求,但如果我的问题被标记为重复,我不会感到惊讶,因为我已经无法再玩剧本了。已经好几周了:)
先谢谢你。

wi3ka0sx

wi3ka0sx1#

一种开销较小的方法是使用pandas

#pip install pandas
import pandas as pd
from pathlib import Path

dip = Path("/home/user/work")
out = dip / "output" # to be adjusted (if needed)

one = pd.read_csv(dip / "one.csv").add_suffix(":")
one.insert(len(one.columns), "", "") #to simulate the blank line

two = pd.read_csv(dip / "two.csv")

for n, id_ in enumerate(one["ID:"], start=1):
    head = one.loc[one["ID:"].eq(id_)].T
    tail = two.loc[two["ID"].eq(id_), ["Activity"]].set_index(["Activity"])
    pd.concat([head, tail]).to_csv(out / f"file{str(n).zfill(2)}.csv", header=False)

输出(file01.csv):

ID:,4815162342
Status:,Open
Date:,29/02/1842
Asset:,9765
Frequency:,Monthly
,
THEONETHATGOTAWAY_01,
THEONETHATGOTAWAY_02,
THEONETHATGOTAWAY_03,

以表格格式:

FF的观点:

home
┗━━ user
    ┗━━ work
        ┣━━ one.csv
        ┣━━ two.csv
        ┗━━ output
            ┗━━ file01.csv

相关问题