2017-09-04 112 views
0

我有2个CSV文件,列数和格式相同,包含有关每行中服务器的详细信息。每个文件都指向一个不同的日子。Python:比较2个CSV文件的差异1列值和第三个CSV文件中的输出

我想比较每个Day2 CSV file的服务器(行)为Size (GB)列(列D)对Day1 CSV fileSize (GB)列的每个服务器(列D),并在任一day2 CSV filecolumn E输出写入或者单独的第三个CSV文件来跟踪每天大小的差异/增长。

我试图在Python中实现它。

接下来,我提供了一个例子:

day1.csv

Server Site  Platform Size(GB) 
a  Primary Windows 100 
b  Secondary Unix  200 
c  Primary Oracle 500 

day2.csv

Server Site  Platform Size(GB) 
a  Primary Windows 150 
b  Secondary Unix  100 
c  Primary Oracle 500 

预期结果 output.csv

Server Site  Platform Size(GB) Growth(GB) 
a  Primary Windows 150  50 
b  Secondary Unix  100  -100 
c  Primary Oracle 500  0 

编辑1:

这是迄今为止我所开发的代码:

import csv 
t1 = open('/day1.csv', 'r') 
t2 = open('/day2.csv', 'r') 
outputt=open("/growth.csv","w") 
fileone = t1.readlines() 
filetwo = t2.readlines() 

for line in filetwo: 
    row = row.split(',') 
    a = str(row[0]) 
    b = str(row[1]) 
    c = str(row[2]) 
    d = float(row[3]) 
    f = float(filetwo.row[3] - fileone.row[3]) 
    outputt.writerow([a,b,c,d,e,f]) 
    outputt.write(line.replace("\n","") + ";6column\n") outputt.close() 
    fileone.close() 
+0

结束虽然问题是非常完整的,我建议你提供当前Python代码来解决这个问题。这将使我们能够进一步帮助您! –

+0

@ CristianRamon-Cortes请在上面的代码上面找到。这是我的草稿到目前为止 –

+0

import csv t1 = open('/ day1.csv','r') t2 = open('/ day2.csv','r') outputt = open(“/ growth。 CSV”, “W”) fileone = t1.readlines() FileTwo传送= t2.readlines() 用于FileTwo传送线: \t行= row.split( '') \t一个= STR(行[ 0]) \t b = STR(行[1]) \t C = STR(行[2]) \t d =浮子(行[3]) \t F =浮子(filetwo.row [3] - fileone .row [3]) \t ou outputt.write(line.replace(“\ n”,“”)+“; 6column \ n”) outputt.close() fileone.close() –

回答

0

这不是一个非常普遍的解决方案,但我试图按照你的方法尽可能地:

import csv 

# Open read files 
file1 = open('day1.csv', 'r') 
file2 = open('day2.csv', 'r') 

# Open output file 
outputFile = open ('day3.csv', 'w') 
csvWriter = csv.writer(outputFile, delimiter=',') 
# Write the output file header 
csvWriter.writerow(["Server", "Site", "Platform", "Size", "Growth"]) 

# Process input files 
csvReader1 = csv.reader(file1, delimiter=',') 
csvReader2 = csv.reader(file2, delimiter=',') 

# Skip headers 
csvReader1.next() 
csvReader2.next() 

# Process data 
for rowF2 in csvReader2: 
    # Get the content of each line in F1 
    rowF1 = csvReader1.next() 

    # Uncomment for debug 
    #print rowF1 
    #print rowF2 

    # Construct output line from F2 values 
    colA = str(rowF2[0]) 
    colB = str(rowF2[1]) 
    colC = str(rowF2[2]) 
    # Compute the growth 
    colD = str(int(rowF2[3]) - int(rowF1[3])) 

    # Write the output file 
    csvWriter.writerow([colA, colB, colC, colD])                      

file1.close() 
file2.close() 
outputFile.close() 

从我的观点最为关注的问题是点:

  • 您需要使用CSV库(CSV读写器)
  • 您需要跳过所需的头时
  • 您需要关闭所有文件在执行
+0

谢谢Cristian –

0

这可以使用Python的CSV库来完成,并且OrderedDict保持原来的文件顺序:

from collections import OrderedDict 
import csv 

with open('day1.csv', 'rb') as f_day1, open('day2.csv', 'rb') as f_day2: 
    csv_day1 = csv.reader(f_day1) 
    csv_day2 = csv.reader(f_day2) 

    header = next(csv_day1) + ['Growth(GB)'] 
    next(csv_day2) 

    day1 = OrderedDict([row[0], [row[1], row[2], int(row[3])]] for row in csv_day1) 
    day2 = OrderedDict([row[0], [row[1], row[2], int(row[3])]] for row in csv_day2) 

with open('output.csv', 'wb') as f_output: 
    csv_output = csv.writer(f_output) 
    csv_output.writerow(header) 

    for server, data in day1.items(): 
     data.append(day2[server][2] - data[2]) 
     data[2] = day2[server][2] 
     csv_output.writerow([server] + data) 

为您提供输出CSV文件,如下所示:

Server,Site,Platform,Size(GB),Growth(GB) 
a,Primary,Windows,150,50 
b,Secondary,Unix,100,-100 
c,Primary,Oracle,500,0 

注意:当使用with时,文件会自动关闭。

测试Python的2.7.12

+0

实际上,我正在使用上述脚本获得结果。感谢您的时间,但在容量减少时没有得到负号。那是我实际上计划根据价值突出显示彩色文本的增长。无论是正面(RED)还是负面(绿色) –

+0

我添加了一个单独增长栏。它现在应该看起来像你的预期结果。 –

+0

感谢您的帮助马丁。非常感谢 –

相关问题