我想知道是否有人可以帮助我提出更好的方法,
基本上,我的文本文件的格式是这样的(有些列多一些,有些列少一些,每列用空格隔开)
AA BB CC DD Col1 Col2 Col3
XX XX XX Total 1234 1234 1234
Aaaa OO0 LAHB TEXT 111 41 99
Aaaa OO0 BLAH XETT 112 35 176
Aaaa OO0 BALH TXET 131 52 133
Aaaa OO0 HALB EXTT 144 32 193
这些文本文件的大小从几百KB到最新最大的文件大小不等,大约100MB,我需要做的是通过添加检查以首先检查是否有重复的数据来合并两个或更多文件如果每行的AA BB CC和DD与其他文件中的任何行匹配,如果是,则将来自Col1 Col2 Col3(等)的数据附加到该行,如果不行,则在新列中填充零。我根据每行的总和来计算前100行,并将前100条结果输出到网页。
这是我正在使用的python代码
import operator
def combine(dataFolder, getName, sort):
files = getName.split(",")
longestHeader = 0
longestHeaderFile =[]
dataHeaders = []
dataHeaderCode = []
fileNumber = 1
combinedFile = {}
for fileName in files:
lines = []
file = dataFolder+"/tableFile/"+fileName+".txt"
with open(file) as f:
x = 0
for line in f:
lines.append(line.upper().split())
if x == 1:
break
splitLine = lines[1].index("TOTAL")+1
dataHeaders.extend(lines[0][splitLine:])
headerNumber = 1
for name in lines[0][splitLine:]:
dataHeaderCode.append(str(fileNumber)+"_"+str(headerNumber))
headerNumber += 1
if splitLine > longestHeader:
longestHeader = splitLine
longestHeaderFile = lines[0][:splitLine]
fileNumber += 1
for fileName in files:
lines = []
file = dataFolder+"/tableFile/"+fileName+".txt"
with open(file) as f:
for line in f:
lines.append(line.upper().split())
splitLine = lines[1].index("TOTAL")+1
headers = lines[0][:splitLine]
data = lines[0][splitLine:]
for x in range(2, len(lines)):
normalizedLine = {}
lineName = ""
total = 0
for header in longestHeaderFile:
try:
if header == "EE" or header == "DD":
index = splitLine-1
else:
index = headers.index(header)
normalizedLine[header] = lines[x][index]
except ValueError:
normalizedLine[header] = "XX"
lineName += normalizedLine[header]
combinedFile[lineName] = normalizedLine
for header in dataHeaders:
headIndex = dataHeaders.index(header)
name = dataHeaderCode[headIndex]
try:
index = splitLine+data.index(header)
value = int(lines[x][index])
except ValueError:
value = 0
except IndexError:
value = 0
try:
value = combinedFile[lineName][header]
combinedFile[lineName][name] = int(value)
except KeyError:
combinedFile[lineName][name] = int(value)
total += int(value)
combinedFile[lineName]["TOTAL"] = total
combined = sorted(combinedFile.values(), key=operator.itemgetter(sort), reverse=True)
return combined
我对Python还是很陌生,所以这可能不是最“ Pythonic”的方式,不管怎么说,它很慢(对于大约6MB的两个文件,大约12秒),并且当我们将代码上传到我们的在AWS服务器上,我们发现从服务器收到500错误,提示标头太大(当我们尝试合并较大的文件时)。任何人都可以帮助我将其完善为更快,更适合Web环境的工具。也只是为了澄清我无权访问AWS服务器或它的设置(这是通过我们的Lead Developer进行的),因此我对如何设置没有真正的线索,我通过localhost进行了大部分开发工作,然后提交到Github。