如何用逗号分割字符串而不在perl的引号内包含逗号?

Posted

技术标签:

【中文标题】如何用逗号分割字符串而不在perl的引号内包含逗号?【英文标题】:How to split a string by comma without including comma inside the quotation mark in perl? 【发布时间】:2011-11-22 11:46:57 【问题描述】:

我有以下代码:

my $file = 'c:\test.log';
open (FILE, "<", $file) or die $!;
my @list = grep /\bAdobe\b/, <FILE>;
my $days;
foreach (@list) 
$days = $_;
print "$days\n";

预期结果是:

"Adobe","10:10:10, 11/10/2011","Ready"

我想用下面的代码用逗号分割结果:

my @sample = split(',', $days);

预期结果是:

"Adobe"
"10:10:10
11/10/2011"
"Ready"

但这不是我想做的:

我想像这样打印输出:

"Adobe"
"10:10:10, 11/10/2011"
"Ready"

如果不使用/安装任何像 Text::CSV 这样的模块,我怎么能做到这一点。

请指教,谢谢。

【问题讨论】:

【参考方案1】:

理想情况下,您应该使用 CSV 解析器,请参阅 Text::CSV。或者只要所有字段都被双引号引起来,那么您可以使用带有稍微复杂的正则表达式的拆分,它会检查分隔符:

split /(?<="),(?=")/, $days;

【讨论】:

成功了!谢谢。我需要做的就是消除引号。【参考方案2】:

我相信它适用于 Text::CSV 模块。 像这个例子这样的东西应该可以工作:

use Text::CSV;

my $file = 'c:\test.log';
open (my $FILE, "<", $file) or die $!;
my $csv = Text::CSV->new;

while (my $row = $csv->getline($FILE)) 
  my @sample = @$row;
  next if $sample[0] !~ /\bAdobe\b/;
  # do whatever you want

【讨论】:

是的,我已经试过这个了。但我被限制不使用/安装来自 cpan 的任何模块。 “安装”不是强制性的,只需从 cpan 下载,解压缩并将“use lib 'path/to/text-csv/lib'”放在脚本头部的某个位置即可。【参考方案3】:

没有必要从 CPAN 安装 Text::CSV(尽管,如果你有这个限制,那么你真的需要修复它),因为标准发行版中的 Text::ParseWords 模块也可以使用。

【讨论】:

【参考方案4】:

由于字符串"Adobe","10:10:10, 11/10/2011","Ready"作为perl代码是有效的,你可以使用eval

my $file = 'c:\test.log';
open my $fh, "<", $file or die $!;
for (grep /\bAdobe\b/, <FILE>) 
    my @sample = eval;
    # code here

但仅对您确定格式有效的数据执行此操作。

来自Data::Dumper的输出:

$VAR1 = [
          "Adobe",
          "10:10:10, 11/10/2011",
          "Ready"
        ];

【讨论】:

以上是关于如何用逗号分割字符串而不在perl的引号内包含逗号?的主要内容,如果未能解决你的问题,请参考以下文章

如何用括号外的逗号分割字符串?

如何用引号和逗号连接多列单元格数据

如何用逗号分割不跟空格的字符串?

如何用逗号和空格java分割表达式

PHP 和 RegEx:用不在括号内的逗号(以及嵌套括号)拆分字符串

java中如何用split对一个字符串按逗号和分号分割成数组