构建自定义解析器

时间:2019-01-17 12:22:09

标签: python csv parsing

绝对不是解析的新手。如何从头开始构建自定义解析器?

我有一个csv文件,其内容如下 ADD UTYPRABTOAW:LOGICRNCID=253, RABINDEX=1, DELAYCLASS=3, TOAWS=35, TOAWE=8;

我希望保留相关值,并删除其他所有内容

我希望将上面的行转换为253,1,3,35,8

我偶然发现了Python解析的概念,但我正在寻找一个起点。 我有150个单独的csv文件,并且每个文件我都必须构建一个单独的解析器。

1 个答案:

答案 0 :(得分:0)

可以使用正则表达式提取数字,但这实际上取决于您要解析的文件的完整格式。如果您的输入文件如下所示:

ADD UTYPRABTOAW:LOGICRNCID=253, RABINDEX=1, DELAYCLASS=3, TOAWS=35, TOAWE=8;
ADD UTYPRABTOAW:LOGICRNCID=253, RABINDEX=2, DELAYCLASS=3, TOAWS=35, TOAWE=8;
ADD UTYPRABTOAW:LOGICRNCID=253, RABINDEX=3, DELAYCLASS=3, TOAWS=35, TOAWE=8;

然后,以下脚本将轻松将其转换为所需的输出CSV格式:

import re
import csv

with open('input.csv', newline='') as f_input, open('output.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output)

    for row in f_input:
        csv_output.writerow(re.findall(r"\d+", row))

output.csv为:

253,1,3,35,8
253,2,3,35,8
253,3,3,35,8

glob库可用于在给定文件夹中的所有匹配文件上执行此过程,例如,所有以名称input开头的CSV文件,例如input*.csv。另外,如果您的文件包含其他不需要的行,则需要添加条件,例如if row.startswith('ADD'):

import re
import csv
import glob

with open('output.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output)

    for filename in glob.glob('input*.csv'):
        with open(filename, newline='') as f_input:
            for row in f_input:
                if row.startswith('ADD'):
                    csv_output.writerow(re.findall(r"\d+", row))