У меня есть данные системного журнала в файле csv, и я пытаюсь отсортировать эти данные по времени.
На самом деле я могу сортировать данные csv с помощью следующего кода.
import csv
import sys, datetime, time
import re
from openpyxl import load_workbook
import openpyxl
import time
def XLSExport(Rows, SheetName, FileName):
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = SheetName
# ws = wb.create_sheet(SheetName)
for x in Rows:
ws.append(x)
wb.save(FileName)
ExcelExport = [["timestamp","source", "message"]]
rows = []
with open("All-Messages-search-result2.csv", 'r') as file:
csvreader = csv.reader(file)
header = next(csvreader)
for row in csvreader:
rows.append(row)
#print(header)
#print(rows)
excel_list = []
for row in rows:
#print(row[0])
row2 = row[0].split(";")
#print(row2[0])
#print(row2)
excel_list.append(f"{row2[0]};{row2[1]};{row2[2]}")
excel_list.sort()
# print(excel_list)
for sorted_ in excel_list:
sorted2_ = sorted_.split(";")
ExcelExport.append([sorted2_[0],sorted2_[1],sorted2_[2]])
#print(sorted2_)
XLSExport(ExcelExport, "Messages-result2.xlsx", "Messages-result2.xlsx")
print("'Messages-result2.xlsx' file has been created. You may find sorted syslog files. Thanks for using this program.")
Посмотрите данные до и после запуска моего кода.
Однако проблема в том, что моему коду требуется слишком много времени для сортировки excel, если в excel слишком много данных, например более 200 тыс. строк.
Я думаю, что проблема, которая делает код медленнее, заключается в том, что мой код добавляет каждую строку в список и сортирует ее по времени. Затем он создает новый Excel, используя список, так что это занимает слишком много времени, если в данных слишком много строк.
Можно ли ускорить процесс?
Мой 2) сверху не правильный. Я пропустил часть row[0]
в row[0].split(";")
. Тем не менее, я думаю, вы могли бы получить то, что я предлагал, сделав for row in csvreader: rows.append(row[0])
, а затем rows.sort()
.
Спасибо Адриан за ваш комментарий. Я согласен с вашим пунктом 1. «Сортировка» не должна быть в моем первом цикле for. Что касается второго пункта, я просто удалил созданный мной список excel_list. Я отредактировал свой код, создав новый excel после rows.sort(), используя отсортированные строки. Я создал второй цикл for, чтобы создать новый excel, в котором хранятся отсортированные журналы. Но создание нового Excel по-прежнему занимает слишком много времени. Как вы думаете, это займет больше 10 минут? Можно ли сделать это еще быстрее?
Пожалуйста, не принимайте во внимание мой комментарий выше. Теперь это занимает 10 секунд. Насколько я понимаю, 2-й цикл не требуется. Кроме того, сортировка должна быть вне цикла for. Спасибо.
Я не вижу возможности принять ответ. Можете ли вы ответить на свой ответ сообщением, чтобы я мог принять ответ, пожалуйста?
Мои предложения в моих комментариях будут выражены в коде как:
def XLSExport(Rows, SheetName, FileName):
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = SheetName
for x in Rows:
ws.append(x)
wb.save(FileName)
ExcelExport = [["timestamp","source", "message"]]
rows = []
with open("All-Messages-search-result2.csv", 'r') as file:
csvreader = csv.reader(file)
header = next(csvreader)
for row in csvreader:
rows.append(row[0])
rows.sort()
for sorted_ in rows:
sorted2_ = sorted_.split(";")
ExcelExport.append([sorted2_[0],sorted2_[1],sorted2_[2]])
#print(sorted2_)
XLSExport(ExcelExport, "Messages-result2.xlsx", "Messages-result2.xlsx")
Итак, устраните это:
for row in rows:
#print(row[0])
row2 = row[0].split(";")
#print(row2[0])
#print(row2)
excel_list.append(f"{row2[0]};{row2[1]};{row2[2]}")
excel_list.sort()
Как это:
for row in csvreader:
rows.append(row[0])
rows.sort()
делает то же самое, если я правильно понимаю. В процессе вы исключаете один цикл for
и выполняете .sort()
один раз вместо каждой итерации цикла.
1) Почему
excel_list.sort()
добавляется после каждой строки? Почему бы не вытащить его из циклаfor
и не запустить один раз, прежде чем экспортировать в Excel? 2) Почему вообщеfor
? Это:excel_list.append(f"{row2[0]};{row2[1]};{row2[2]}")
похоже восстанавливает то, что выsplit
здесь:row2 = row[0].split(";")
. Почему бы просто не сделать:rows.sort()
?