免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5064 | 回复: 10
打印 上一主题 下一主题

跪求一个split写法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-15 15:57 |只看该作者 |倒序浏览
字符串$line内容为   "a","a,a",1,""b,b,b"",2
现要求按逗号,分隔,但是引号""括起来的,不作为分隔符!
split(/,/,$line)结果为7个元素,实际要求分隔为5个元素: "a"          "a,a"        1        ""b,b,b""        2
谢谢了!

[ 本帖最后由 千禧龙 于 2007-11-15 16:47 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-11-15 17:01 |只看该作者
试试这样做看行不行
首先,将这个字符串赋给一个临时变量$tmp,下面对$tmp操作:
一个一个字符判断,看当前的逗号(,)是在第几个引号(")后的,如果该逗号(,)前面有奇数个引号(")则跳过,如果是偶数个引号(")则将它替换成另一个分隔符(如:'|'),这样你的$tmp就变成:"a"|"a,a"|1|""b,b,b""|2 了,然后用split(/\|/, $tmp)。

论坛徽章:
0
3 [报告]
发表于 2007-11-15 17:10 |只看该作者
use Text::ParseWords;
quotewords()
这个能完成你的需要,使用方法perldoc查看

论坛徽章:
0
4 [报告]
发表于 2007-11-15 20:37 |只看该作者
重点是第二点.

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 = &quotewords('\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标准定义的数据, 用正则式还是可以提取的.

[ 本帖最后由 Lonki 于 2007-11-15 20:40 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-11-16 08:52 |只看该作者
建议用模块来做
Text::CSV

[ 本帖最后由 ubac 于 2007-11-16 11:01 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-11-16 10:52 |只看该作者
原帖由 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.

论坛徽章:
0
7 [报告]
发表于 2007-11-16 11:05 |只看该作者
呵呵,笔误,见笑了!

论坛徽章:
0
8 [报告]
发表于 2007-11-16 14:33 |只看该作者
晕,现在才发现,lz竟然有个引号里面还引号,汗颜

论坛徽章:
0
9 [报告]
发表于 2007-11-16 17:15 |只看该作者
原帖由 千禧龙 于 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:
#!/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

论坛徽章:
0
10 [报告]
发表于 2007-11-19 17:05 |只看该作者
感谢楼上几位大侠,问题又来了,Text::CVS 不能解析中文字符,该怎么办呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP