我有这种如何使用Perl提取数据列?
NAME1 NAME2 DEPTNAME POSITION
JONH MILLER ROBERT JIM CS ASST GENERAL MANAGER
我所要的输出来名1名2和位置的字符串我怎样才能使用分流/正则表达式/装饰/等,并没有使用CPAN模块做什么呢?
我有这种如何使用Perl提取数据列?
NAME1 NAME2 DEPTNAME POSITION
JONH MILLER ROBERT JIM CS ASST GENERAL MANAGER
我所要的输出来名1名2和位置的字符串我怎样才能使用分流/正则表达式/装饰/等,并没有使用CPAN模块做什么呢?
如果输入数据进来作为字符串(@strings)的阵列,这
for my $s (@strings) {
my $output = join ' ',
map /^\s*(.+)\s*$/ ? $1 :(),
unpack('A19 A15 x19 A*', $s);
print "$output\n"
}
将提取并修剪所需的信息。
NAME1 | NAME2 |位置
和
JONH苗|罗伯特吉姆| ASST GENERAL MANAGER
(在 '|' 被列入由我要的结果更好expalnation)
问候
RBO
解压缩是一个很好的工具,我们在_Effective Perl Programming_中几乎覆盖了这个例子。我希望在下一本书中有一整章包装:) – 2010-08-23 21:40:46
@brian,“The Book”看起来很有希望,我很想在高级正则表达式(比如现代版的japhys Regex Arcana :http://japhy.perlmonk.org/articles/tpj/2004-summer.html)。此外,在旧版“高级Perl编程”(由Srinivasan撰写)的第一版中,还有一些非常有趣的高级主题(Perl胆量,嵌入,XS-hand和eval),这些都是从第二版中排除的。 (由Simon Cozens撰写)。这些(更技术性的)高级主题不属于任何我知道的实际书籍。 (顺便说一句:我昨天订购了E.P.P的第二版)。 – 2010-08-24 20:11:17
对于Perl的胆量,请_Extending和嵌入Perl_。 _Advanced Perl Programming,1st Edition_的一些有趣部分是_Mastering Perl_的基础。对于花哨的正则表达式的东西,_Mastering Regular Expressions_。 _Mastering Perl_也有一些奇特的正则表达式,就像_Effective Perl Programming_一样。也许你只需要阅读更多书籍。请记住,所有这些东西都在文档中,所以你不需要购买一本书。 – 2010-08-24 21:09:01
这取决于它们是固定长度的字段,还是它们是制表符分隔的。最简单的(使用分割)是如果它们是制表符分隔的。
my ($name1, $name2, $deptName, $position) = split("\t", $string);
如果他们固定长度,并假设他们都是,比如说,10个字符长,你可以分析它像
my ($name1, $name2, $deptName, $position) = unpack("A10 A10 A10 A10", $string);
拆就空白:
@string_parts = split /\s{2,}/, $string;
这会将$string
拆分为子串列表。分隔符将是正则表达式\s+
,这意味着一个或多个空格字符。这包括空格,制表符和(除非我错了)换行符。
编辑:我看到其中一个要求不是只在一个空间上拆分,而是在两个或多个空间上拆分。我相应地修改了正则表达式。
这种解决方案将拆分字符串像“JONH “,”MILLER“,但它的名字应该是JONH MILLER,这意味着解决方案是不正确的。 – 2010-08-23 18:17:02
@Nikhil:好poi NT。但是你可以像'@string_parts = split/\ s \ s + | \ t \ s * /,$ string'那样分割多个空格,或者一个标签和其他可能的空格字符。 – 2010-08-23 18:25:07
@Platinum:那是真的,我正在做我的答案中的同样的事情。 – 2010-08-23 18:33:35
考虑从一个Perl一行程序使用自动分割你的命令行:
$ perl -F/\s{2,}/ -ane 'print qq/@F[0,1,3]\n/' file
单线程将在两个或更多个连续空格处分割并打印第一,第二和第四个字段,对应于NAME1,NAME2和POSITION字段。
当然,如果你只有一个空格分隔NAME1和NAME2条目,这将会中断,但需要更多关于你的文件的信息以确定最佳的行动方案。
downvote的任何理由? – Zaid 2010-08-24 06:27:04
假设字段之间的空间不是固定的,所以在两个或多个空格的基础上拆分字符串,以便它不会像JONH MILLER那样将Name拆分为两部分。
#!/usr/bin/perl
use strict;
use warning;
my $string = "NAME1 NAME2 DEPTNAME POSITION
JONH MILLER ROBERT JIM CS ASST GENERAL MANAGER ";
my @string_parts = split /\s\s+/, $string;
foreach my $test (@string_parts){
print"$test\n";
}
从样本中可以看出,单个空间属于数据,但是2个或更多个连续空间不包含。因此,您可以轻松拆分2个或更多空间。我唯一加入的是List::MoreUtils::mesh
use List::MoreUtils qw<mesh>;
my @names = map { chomp; $_ } split /\s{2,}/, <$file>;
my @records = map { chomp; { mesh(@names, @{[ split /\s{2,}/ ]}) } } <$file>;
你在20天前问你的第一个问题,得到4个答案。在那个时候,你还没有投票支持任何一个,你没有接受答案,如果没有一个答案对你有帮助,你还没有澄清你的问题来寻求更好的答案。纵观历史,有人可能会得出结论:您无意为本网站贡献任何东西,而只是采取行动。 – 2010-08-23 17:46:53
对不起,我不知道从现在开始我会对他们投票。谢谢你告诉我。 – Sunny 2010-08-23 18:00:56
@Paul - 仍然是0票:( – DVK 2010-08-24 10:23:06