Мне было интересно, может ли кто-нибудь помочь мне придумать лучший способ сделать это,
в основном у меня есть текстовые файлы, которые отформатированы следующим образом (некоторые имеют больше столбцов, некоторые имеют меньше, каждый столбец разделенпробелы)
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
Размер этих текстовых файлов варьируется от нескольких сотен КБ до примерно 100 МБ для самых новых и самых больших файлов. Что мне нужно сделать, это объединить два или более файлов, добавив проверку, чтобы увидеть, есть лилюбые дублирующие данные, прежде всего, поэтому проверяя, совпадают ли 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
I 'Я довольно плохо знаком с Python, так что это может быть не самый «Pythonic» способ сделать это, в любом случае это работает, но это медленно (около 12 секунд для двух файлов по 6 МБ каждый), и когда мы загрузили код на наш сервер AWS, мы обнаружили, чтомы получили бы ошибку 500 от сервера, говорящую, что заголовки были слишком большими (когда мы пытались объединить большие файлы).Может ли кто-нибудь помочь мне превратить это в нечто более быстрое и более подходящее для веб-среды.Также просто чтобы уточнить, что у меня нет доступа к серверу AWS или его настройкам, который проходит через нашего ведущего разработчика, поэтому я не имею ни малейшего понятия о том, как он настроен, большую часть своей работы с разработчиками я выполняю через localhost, а затем фиксируюGithub.