2个CSV文件。在迁移之前和之后执行。想要将计数与阈值进行比较

时间:2017-10-23 12:08:32

标签: python csv compare

我有2个csv文件,如:

格式

  • REPORT_NUM,EXEC,REPORT_NAME,REPORT_COUNT

before.csv

  • 1,1,"报告1",45
  • 2,1,"报告2",456
  • 3,1,"报告3",11
  • 4,1,"报告4",0

after.csv

  • 1,1,"报告1",47
  • 2,1,"报告2",456556
  • 3,1,"报告3",0
  • 4,1,"报告4",212

我基本上需要每个REPORT_NUM比较REPORT_COUNT,然后在REPORT_COUNT之前输出第三个csv与REPORT_COUNT之后,当出现阈值交叉时( 之后超过10%时)不同于之前)。 EXEC只是一个执行运行。

所以result.csv可能会显示:

  • 2,1,"报告2",456,456556
  • 3,1,"报告3",11,0
  • 4,1,"报告4",0,212

我正在寻找以下灵感:

Comparing values between 2 CSV files and writing to a 3rd CSV file

Python: Comparing two CSV files and searching for similar items

我继续搜索,但感谢任何反馈。

提前谢谢!

P.S。我假设Python是最好的,我不介意什么语言,但我有基本的python理解。我开始用bash写这个并使用" diff"和" sed" ..所以我可能会走这条路..

1 个答案:

答案 0 :(得分:1)

根据您提供的2个链接:

import csv

with open('before.csv', 'r') as before:
    before_indices = dict((i[2], i[3]) for i in csv.reader(before))


with open('after.csv', 'r') as reportAfter:
    with open('results.csv', 'w') as results:
        reader = csv.reader(reportAfter)
        writer = csv.writer(results, quoting=csv.QUOTE_NONNUMERIC)

        for row in reader:
            value = before_indices.get(row[2])

            if float(row[3]) > 1.1*float(value) or float(row[3]) < 0.9*float(value):
                writer.writerow([int(row[0]),int(row[1]),row[2],int(value),int(row[3])])

这将根据您在Linux上的示例输入生成所需的输出。在Windows上,您需要根据此Python3: writing csv files进行更改。如果你有非整数,你可能想要将最后一行中的int()更改为float()以保持小数。