【发布时间】:2015-07-15 11:32:51
【问题描述】:
例如:
输入 csv1:
id,count
1A,9
2A,8
4A,3
6A,5
输入 csv2:
id,count
1A,2
2A,2
3A,1
4A,7
输入 csv3:
id,count
1A,2
5A,1
6A,1
8A,2
9A,1
'id' 在所有 3 个 csv 文件中分布不均,有些显示在 1 个文件中,有些则没有。
我想要的输出 csv 文件如下所示:
output.csv(按 id 汇总计数值)
id,count
1A,13
2A,10
3A,1
4A,10
5A,1
6A,6
8A,2
9A,1
或
output.csv(按id列出所有计数值,该项目的值0确实存在于相应的csv文件中但存在于其他csv文件中)
id,count1,count2,count3
1A,9,2,2
2A,8,2,0
3A,0,1,0
4A,3,7,0
5A,0,0,1
6A,5,0,1
8A,0,0,2
9A,0,0,1
非常感谢您的帮助。
=======================更新====================
感谢@Lilith 的回答,它解决了问题 1。我修改了代码以额外工作:代码可以处理给定文件夹中的所有 csv 文件,结果 csv 中的行按“计数”值排序.无法获得解决方案,可以稍后尝试。
import os
import csv
from skipdict import SkipDict
data = {}
def mergeCSV(fileDir,outFile,header1,header2):
getDataFromAll(fileDir)
writeCSVDatatToFile(outFile,header1,header2)
def getDataFromAll(fileDir):
for root, dirs, files in os.walk(fileDir):
for aFile in files:
if aFile.endswith(".csv"):
aFile = os.path.join(root, aFile)
worker(aFile)
def worker(aFile):
with open(aFile, 'rb') as csvfile:
csv_reader = csv.reader(csvfile, delimiter=',', quotechar='|')
for row in list(csv_reader)[1::]:
if row[0] in data:
data[row[0]] += int(row[1])
else:
data[row[0]] = int(row[1])
def writeCSVDatatToFile(outFile,header1,header2):
sorted_data = SkipDict(data)
with open(outFile, 'w') as csvfile:
fieldnames = [header1, header2]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for key, value in sorted_data.items():
writer.writerow({header1: key, header2: int(value)})
mergeCSV('/home/csv/','/home/csv/output.csv','id','count')
【问题讨论】:
-
我投票决定将此问题作为离题结束,因为 SO 不是代码编写服务。
-
您有没有尝试解决这个问题?如果你有,请在你的问题中包含你的代码和研究,以显示什么对你不起作用。如果没有,您应该先尝试自己解决它,然后在此处发布代码和研究。它也让其他人更容易回答您的问题!
-
你的代码在哪里?你试过什么没用?
-
很抱歉没有提供代码,因为我无法正确获取代码。我知道这不是代码编写服务,我正在寻求帮助。如果有提供代码,我不会否认;但我也在接受任何可以帮助我解决问题的建议和建议或粗略的想法。在 stackoverflow 帖子中,人们会给出建议或建议,例如“尝试 *** 库,使用字典”等。如果您知道一些事情并想提供帮助,请感谢您;如果你不想帮助或不能帮助,那没关系。但你不必刻薄。