繁体   English   中英

如何使用Perl提取数据列?

[英]How can I extract the columns of data with Perl?

我有这种弦

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

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

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

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

如果它们是固定长度,并且假设它们都是10个字符长,则可以像

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

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

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

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

NAME1 | NAME2 | 位置

约翰·米勒| 罗伯特·吉姆| 资产经理

(为了更好地说明结果,我加入了“ |”)

问候

机器人

假设字段之间的空间不是固定的,那么请在两个或多个空格的基础上分割字符串,以使它不会像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个或更多空间上分割。 我唯一要添加的是使用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>;

要在空白处分割:

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

这会将$string拆分$string列表。 分隔符为regex \\s+ ,表示一个或多个空格字符 其中包括空格,制表符和(除非我弄错了)换行符。

编辑:我看到要求之一不是仅在一个空间上分割,而是在两个或多个上分割。 我相应地修改了正则表达式。

考虑从命令行在Perl单行代码中使用自动拆分:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM