如何使用Perl提取数据列?

时间:2010-08-23 17:35:52

标签: regex perl split trim names

我有这种字符串

NAME1              NAME2          DEPTNAME           POSITION
JONH MILLER        ROBERT JIM     CS                 ASST GENERAL MANAGER 

我希望输出为name1 name2,并且如何使用split / regex / trim / etc并且不使用CPAN模块来定位?

6 个答案:

答案 0 :(得分:6)

这取决于它们是固定长度的字段,还是它们是制表符分隔的。最简单的(使用拆分)是它们是否以制表符分隔。

my ($name1, $name2, $deptName, $position) = split("\t", $string);

如果它们是固定长度,假设它们都是10个字符长,你就可以解析它了

my ($name1, $name2, $deptName, $position) = unpack("A10 A10 A10 A10", $string);

答案 1 :(得分:2)

如果您的输入数据是以字符串数组(@strings)形式出现的,那么

for my $s (@strings) {
   my $output = join ' ',
                map /^\s*(.+)\s*$/ ? $1 : (),
                unpack('A19 A15 x19 A*', $s);
   print "$output\n"
}

将提取和修剪所需的信息。

  

NAME1 | NAME2 | POSITION

   JONH MILLER |罗伯特吉姆| ASST总经理

(我为了更好地说明结果而包含'|')

此致

RBO

答案 2 :(得分:1)

假设字段之间的空间没有固定,所以基于两个或多个空格拆分字符串,这样就不会像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";
}

答案 3 :(得分:1)

从那里的示例中,单个空间属于数据,但是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>;

答案 4 :(得分:0)

要拆分空格:

@string_parts = split /\s{2,}/, $string;

这会将$string拆分为子串列表。分隔符将是正则表达式\s+,这意味着一个或多个空格字符。这包括空格,制表符和(除非我弄错了)换行符。

编辑:我看到其中一个要求不是仅拆分一个空格,而是拆分两个或更多空格。我相应地修改了正则表达式。

答案 5 :(得分:0)

考虑在命令行的Perl单行中使用autosplit:

$ perl -F/\s{2,}/ -ane 'print qq/@F[0,1,3]\n/' file

单行将在两个或多个连续空格上分割并打印第一,第二和第四个字段,对应于NAME1,NAME2和POSITION字段。

当然,如果你只有一个空格分隔NAME1和NAME2条目,这将会中断,但是需要更多关于你文件的信息,以确定最佳的行动方案。