使用标头将特定文本文件解析为CSV格式

时间:2015-12-24 12:13:16

标签: python csv text-files

我有一个每隔几毫秒更新一次的日志文件,但是当前信息是用四(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的新手,我只需要帮助我正在编写的这部分程序。

提前谢谢大家!

1 个答案:

答案 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

编辑:我添加了对不同标题的支持。