跪求一个split写法

跪求一个split写法

字符串$line内容为   "a","a,a",1,""b,b,b"",2
现要求按逗号,分隔,但是引号""括起来的,不作为分隔符!
split(/,/,$line)结果为7个元素,实际要求分隔为5个元素: "a"          "a,a"        1        ""b,b,b""        2
谢谢了!

试试这样做看行不行
首先,将这个字符串赋给一个临时变量$tmp,下面对$tmp操作:
一个一个字符判断,看当前的逗号(,)是在第几个引号(")后的,如果该逗号(,)前面有奇数个引号(")则跳过,如果是偶数个引号(")则将它替换成另一个分隔符(如:'|'),这样你的$tmp就变成:"a"|"a,a"|1|""b,b,b""|2 了,然后用split(/\|/, $tmp)。
use Text::ParseWords;
quotewords()
这个能完成你的需要,使用方法perldoc查看
重点是第二点.

1. Text::ParseWords只能处理很简单的嵌套, 如果处理上面的例子结果是:
#&testTextParseWords;
sub testTextParseWords {
    use Text::ParseWords;

    my $str = q/"a","a,a",1,""b,b,b"",2/;
    print "$str\n";
    
    my @words = "ewords('\s*,\s*', 1, $str);
    map { print "[$_] "} @words;
}


输出:
["a"] ["a,a"] [1] [""b] [b""] [2]



2. 你的定义格式会产生歧义.
   按你的理解: ""b,b,b""是一个字段["b,b,b"] 对吧?
   那么前面的"a","a,a"可以理解为一个字段[a","a,a], 而不是[a]和[a,a]这2个字段.

   解决办法? 请参考CSV(comma separated values)标准.
   按照CSV标准: 某字段中的一个"必须用2个"来表示, 整个字段用"括起来.
   你的数据唯一不合格式的是""b,b,b"" 它用CSV来表示应该是"""b,b,b"""
   
   用Excel将数据另存为.csv然后用Notepad打开就以看到是如何转换的.
   
   CPAN有不少CSV模块.

3. 按照csv标准定义的数据, 用正则式还是可以提取的.

建议用模块来做
Text::CSV



QUOTE:
原帖由 ubac 于 2007-11-16 08:52 发表
建议用模块来做
Text::CVS

LZ的数据不满足CSV定义, 无法应用这个module, 上面第2点分析了.

再给出一些web:

Wikipedia的定义, 很好, 不过恐怕只有上代理跨过伟大的墙
http://en.wikipedia.org/wiki/Comma-separated_values

Perl Text::CSV
http://search.cpan.org/~alancitt/Text-CSV-0.01/CSV.pm

它的下面也提到了csv的定义:
A field within CSV may be surrounded by double-quotes.
A field within CSV must be surrounded by double-quotes to contain a comma.
A field within CSV must be surrounded by double-quotes to contain an embedded double-quote, represented by a pair of consecutive double-quotes.
呵呵,笔误,见笑了!
晕,现在才发现,lz竟然有个引号里面还引号,汗颜


QUOTE:
原帖由 千禧龙 于 2007-11-15 15:57 发表
字符串$line内容为   "a","a,a",1,""b,b,b"",2
......

Hi,

Using Perl Module: TEXT::CSV_XS
Pay more attention on CSV Format. If double quote within double quote,
you must add extra double quote as ESCAPE, like this:
""a.b.c"" => Add more " to escape 2nd. " : """a,b,c""", just like Microsoft Visual Baisc
Here is sample code:

QUOTE:
#!/usr/bin/perl -w
use strict;
use Text::CSV_XS;
my $csv = Text::CSV_XS->new;
my $csv_string =  q("a","a,a",1,""b,b,b"",2);    # your original
# escape double quote
$csv_string =~ s/\"{2}/\"\"\"/g;
print "sample csv: [$sample_input_string]\n";
if ($csv->parse($csv_string)) {
    my @field = $csv->fields;
    my $count = 0;
    for my $column (@field) {
        print ++$count, " => ", $column, "\n";
    }
    print "\n";
} else {
    my $err = $csv->error_input;
    print "parse() failed on argument: ", $err, "\n";
}

--ulmer
感谢楼上几位大侠,问题又来了,Text::CVS 不能解析中文字符,该怎么办呢?