在Perl中,如何使用带引号的字符串正确解析制表符/空格分隔文件?

时间:2010-12-21 14:41:35

标签: perl parsing split text-parsing

我需要解析在Perl中有很多列的制表符/空格分隔文件。这些值是双引号括起来的大字符串。这些字符串可以包含任何字符,例如制表符和空格或其他任何字符。

当我尝试使用split函数解析它们时,它也会分割这些字符串。现在,我如何让perl理解“”中的字符串是单个列条目?

一个简单的例子是,

12  345546.67677   "Hello World!!!" -567.55656 0.5465767 "Hello_Again;   "

3 个答案:

答案 0 :(得分:20)

使用Text::CSV库,它可以处理所有边缘情况。它允许您设置分隔符:

my $csv = Text::CSV->new({sep_char => "\t"});

答案 1 :(得分:7)

请注意,您说制表符/空格分隔。如果分隔符是混合的和/或您必须将连续的空格视为一个,则使用Text::ParseWords可能更容易:

#!/usr/bin/perl

use Text::ParseWords qw( quotewords );
use YAML;

while ( my $line = <DATA> ) {
    print Dump [ quotewords('\s+', 0, $line) ];
}

__DATA__
12  345546.67677   "Hello World!!!" -567.55656 0.5465767 "Hello_Again;   "

输出:

---
- 12
- 345546.67677
- Hello World!!!
- -567.55656
- 0.5465767
- 'Hello_Again;   '

答案 2 :(得分:3)

其他可能性有Regexp::Common::balancedText::Balanced