我正在尝试处理一个大管道“|”带分隔符、双引号限定的文本文件(>700,000 条记录,每条记录 >3,000 个字符,每条记录 28 个字段)。使用Python脚本。我遇到了一个问题,因为 csv 解析器由于文件中字段文本中嵌入的未转义双引号字符和管道而错误地解析字段。由于文件中不存在制表符,我想通过将双引号管道双引号分隔符/限定符字符序列(“|”)替换为制表符(\t),将其转换为制表符分隔文件。如果每个字段都已填充但有些字段未填充,则这将相对简单。未填充的字段由空字符串表示,因此我可以在任何位置按顺序使用 1 到 7 个管道分隔符,并以双引号开头。
一个简单的例子是:
"abc"|"2016-07-30"|"text narrative field"|"2016-08-01"|"123"|"456"|"789"|"EOR"
一个比较有代表性的例子是:
"abc"|"2017-01-01"|"height: 5' 7" (~180 cm) | weight: 80kg | in good health"|"2016-01-10"||||"EOR"
我一直在尝试编写一个正则表达式,它将用制表符替换每个管道字符/双引号组合或管道字符序列,其前面和后面紧跟着双引号 1 for 1 。我发现了许多用单个字符替换重复字符串的正则表达式示例,但没有一个示例用替代字符的等长字符串替换一系列重复字符。
我尝试了以下正则表达式:"\|{1,}"
它适用于单个管道字符,但使用单个 TAB 按顺序替换多个管道。我还需要处理以下相关方面:
- 删除行首/双引号 (^")
- 删除双引号/行尾 ("$)
- 并用与管道字符相同数量的制表符替换双引号/管道(1个或多个)/行尾(例如“\|$)
应用正则表达式后的输出记录将如下所示,使用 \t 表示制表符:
abc\t2016-07-30\ttext narrative field\t2016-08-01\t123\t456\t789\tEOR
abc\t2017-01-01\theight: 5' 7" (~180 cm) | weight: 80kg | in good health\t2016-01-10\t\t\t\tEOR
我愿意在 python 或 Linux 中使用 sed 或 awk 解决这个问题