【问题标题】:Replacing Quote-and-Multiple-Comma Delimiters in Perl [duplicate]在 Perl 中替换引号和多个逗号分隔符 [重复]
【发布时间】:2016-10-27 11:21:15
【问题描述】:

我有一个非常大的文件需要用 Perl 解析。文件格式(我无法更改)最初是为了允许文件在 Excel 中以 CSV 格式打开。具体到这个问题,我需要用竖线(|)替换每行中的分隔符。通常这不是一项艰巨的工作,但我有一些问题(如下),虽然我有解决方案,但我想知道是否有更有效的方法来完成我的任务。

  1. 数据本身包含带逗号的 cmets(这意味着我无法找到并替换逗号)
  2. 每个“单元格”数据值都包含在引号中,但如果单元格为空白,则不存在引号

文件中的示例行:

"Foo Bar","More Foo","More Bar",,,,,"Yet More","Comma,Separated,Statement"

我当前的解决方案类似于下面的代码。它可以工作,但看起来不优雅,需要多次处理每一行(我想避免这种情况,因为这个文件非常大)。

# Change the delimiter
$line =~ s/",,,,,"/|||||/g;
$line =~ s/",,,,"/||||/g;
$line =~ s/",,,"/|||/g;
$line =~ s/",,"/||/g;
$line =~ s/","/|/g;

$line =~ s/^"//;     # Remove leading quotation mark
$line =~ s/"$//;     # Remove trailing quotation mark

有人可以帮我找到更快、更优雅的解决方案吗?

【问题讨论】:

  • 我可以接受这个作为副本。出于某种原因,我没有以该线程中概述的方式考虑问题以找到它。非常感谢!

标签: regex perl csv


【解决方案1】:

使用Text::CSV_XS。读取每一行,获取每个值,然后用管道重新连接。让模块为您处理所有格式问题。

friedo's answerReplace commas with pipes, but not the commas enclosed in double quotes中的代码。

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    相关资源
    最近更新 更多