我有一个每隔几毫秒更新一次的日志文件,但是当前信息是用四(4)个不同的分隔符保存的。日志文件包含数百万行,因此在excel中执行操作的可能性为null。
我剩下的工作类似于:
Sequence=3433;Status=true;Report=223313;Profile=xxxx;
Sequence=0323;Status=true;Header=The;Report=43838;Profile=xxxx;
Sequence=5323;Status=true;Report=6541998;Profile=xxxx;
我希望这些设置为:
Sequence,Status;Report;Header;Profile
3433,true,Report=223313,,xxxx
0323,true,Report=43838,The,xxxx
5323,true,Report=6541998,,xxxx
这意味着我需要使用等于" ="的所有部分来创建标题。跟随它的符号。文件中的所有其他操作都将得到处理,这将用于执行文件之间的比较检查以及替换或追加字段。由于我是python的新手,我只需要帮助我正在编写的这部分程序。
提前谢谢大家!
答案 0 :(得分:1)
你可以试试这个。
首先,我打电话给csv library以减少逗号和引号的工作。
import csv
然后我创建了一个函数,它从日志文件中获取一行,并输出一个字典,其中包含在标题中传递的字段。如果当前行没有来自标题的特定字段,则它将保持填充空字符串。
def convert_to_dict(line, header):
d = {}
for cell in header:
d[cell] = ''
row = line.strip().split(';')
for cell in row:
if cell:
key, value = cell.split('=')
d[key] = value
return d
由于标题和字段数可能因文件而异,因此我创建了一个提取它们的函数。为此,我使用了一组,一组独特的元素,但也是无序的。所以我转换为list
并使用sorted
函数。不要忘记seek(0)
来回复文件!
def extract_fields(logfile):
fields = set()
for line in logfile:
row = line.strip().split(';')
for cell in row:
if cell:
key, value = cell.split('=')
fields.add(key)
logfile.seek(0)
return sorted(list(fields))
最后,我制作了一段代码,其中打开了要读取的日志文件和要写入的csv文件。然后,它提取并写入标题,并写入每个转换后的行。
if __name__ == '__main__':
with open('report.log', 'r') as logfile:
with open('report.csv', 'wb') as csvfile:
csvwriter = csv.writer(csvfile)
header = extract_fields(logfile)
csvwriter.writerow(header)
for line in logfile:
d = convert_to_dict(line, header)
csvwriter.writerow([d[cell] for cell in header])
这些是我用作例子的文件:
<强> report.log 强>
Sequence=3433;Status=true;Report=223313;Profile=xxxx;
Sequence=0323;Status=true;Header=The;Report=43838;Profile=xxxx;
Sequence=5323;Status=true;Report=6541998;Profile=xxxx;
report.csv
Header,Profile,Report,Sequence,Status
,xxxx,223313,3433,true
The,xxxx,43838,0323,true
,xxxx,6541998,5323,true
我希望它有所帮助! :d
编辑:我添加了对不同标题的支持。