如何使用pyparsing将表格格式文本文件转换为CSV?
使用pyparsing转换ASCII表格到CSV的示例
当然可以用pyparsing来实现这个转换!这种带分隔线的ASCII表格是很典型的结构化文本,pyparsing的语法定义能力刚好能轻松处理它。下面是一个完整的可运行示例:
首先确保你已经安装了pyparsing:
pip install pyparsing
然后是转换代码:
import pyparsing as pp def ascii_table_to_csv(table_text): # 定义分隔线的语法:以+开头,中间是若干个---+的组合 separator_line = pp.Literal("+") + pp.OneOrMore(pp.Word("-") + pp.Literal("+")) # 定义单元格:匹配到下一个|之前的所有内容,自动忽略前后的空白 cell = pp.SkipTo(pp.Literal("|")).setWhitespaceChars(" \t").setName("cell") # 定义数据行:以|开头,后面是若干个单元格+|的组合 data_row = pp.Literal("|") + pp.ZeroOrMore(cell + pp.Literal("|")) # 解析所有行 parsed_rows = [] for line in table_text.splitlines(): line = line.strip() if not line: continue # 跳过分隔线 if separator_line.matches(line): continue # 解析数据行 parsed = data_row.parseString(line) # 提取单元格内容,去掉每个单元格前后的空白,过滤掉空字符串(解析后会有多余空元素) cells = [cell.strip() for cell in parsed if cell.strip()] parsed_rows.append(cells) # 转换为CSV格式,用逗号分隔 return "\n".join([",".join(row) for row in parsed_rows]) # 测试你的输入文本 input_table = """+---------------------+--------------+---------------+ | column_date | column_id | column_desc | +---------------------+--------------+---------------+ | 2001-01-01 00:00:00 | 12345 | abc bar | | 2001-01-01 00:00:00 | 4567 | defg | +---------------------+--------------+---------------+""" # 生成CSV csv_output = ascii_table_to_csv(input_table) print(csv_output)
代码说明:
- 分隔线匹配:
separator_line专门识别那些由+和-组成的分隔行,解析时直接跳过这些行。 - 单元格解析:
cell用SkipTo(pp.Literal("|"))匹配两个|之间的所有内容,同时通过setWhitespaceChars确保自动忽略单元格前后的空格和制表符。 - 数据行处理:解析每行后,提取有效单元格内容,过滤掉解析过程中产生的空字符串,再把每行的单元格用逗号连接成CSV行。
运行这段代码后,输出就是你期望的CSV格式:
column_date,column_id,column_desc 2001-01-01 00:00:00,12345,abc bar 2001-01-01 00:00:00,4567,defg
内容的提问来源于stack exchange,提问作者Deniz
相关产品推荐
相关产品推荐

