質問

私はこの種の文字列を持っています

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

出力をname1 name2と位置にしたいのですが、CPANモジュールを使用せずに、split/regex/trim/etcを使用して実行するにはどうすればよいですか?

役に立ちましたか?

解決

入力データが文字列(@strings)の配列として入っている場合、これ

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

必要な情報を抽出してトリミングします。

name1 | name2 |ポジション

ジョン・ミラー|ロバート・ジム|ゼネラルマネージャー

(「|」は結果をより良くするために私に含まれていました)

よろしく

RBO

他のヒント

それらが固定された長さフィールドであるかどうか、またはそれらがタブ分離されているかどうかによって異なります。最も簡単な(分割を使用)は、タブ分離されている場合です。

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

それらが固定された長さであり、それらがすべて10文字の長さであると仮定すると、あなたはそれをのように解析することができます

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

フィールド間のスペースが固定されていないと仮定すると、2つ以上のスペースに基づいて文字列を分割して、Jonh Millerのような名前を2つの部分に壊さないように.

#!/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>;

コマンドラインのPerl One-LinerでAutoSplitを使用することを検討してください。

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

ワンライナーは2つ以上の連続したスペースで分割され、name1、name2、および位置フィールドに対応する1番目、2番目、および4番目のフィールドを印刷します。

もちろん、name1とname2エントリを分離するスペースが1つだけある場合、これは破損しますが、最良のアクションコースが何であるかを確認するために、ファイルに関する詳細情報が必要です。

Whitespaceで分割する:

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

これは分割されます $string サブストリングのリストに。セパレーターは正規表現になります \s+, 、それは意味します 1つ以上の白文字の文字. 。これには、スペース、タブ、および(私が間違っていない限り)ニューラインが含まれます。

編集: 要件の1つは、1つのスペースのみで分割されるのではなく、2つ以上で分割することです。それに応じて正規表現を修正しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top