0

次の問題:

行に 25 または 26 のフィールドがある区切りファイルがあります。25 フィールドを持つすべての行について、13 番目のフィールドの後に空の行を追加して、26 フィールドも持つようにする必要があります。

年:

Z|432651242|987654321|XYZ|Abc|DEFEF||Abc-De-Fg|18|33221|Qwerty|18.06.3213|abc||123|Tepp|11.07.4443|2|||||4433322342344||

新しい:

Z|432651242|987654321|XYZ|Abc|DEFEF||Abc-De-Fg|18|33221|Qwerty|18.06.3213|abc|||123|Tepp|11.07.4443|2|||||4433322342344||

変更が必要な行をフィルタリングすることができました:

#!/usr/bin/perl
use strict;
use warnings;

my (@cols,$fieldLength,);
while(<>){
  @cols = split('\|', $_);
  $fieldLength=@cols;
  if ($fieldLength==25){
  print $_;
  }
}

私のアイデアは、区切り文字「|」を置き換えることでした "||" で 13 番目のオカレンスを実行しましたが、なんとか実行できませんでした。私はそれをグーグルで検索しようとしましたが、例はうまくいきませんでした。

誰か助けてくれませんか?

CPAN の CSV モジュールを使用したソリューションもありがたいです。

4

2 に答える 2

1

|区切り文字がフィールドのデータに表示されないと安全に想定できる場合はsplit、 andを使用できますspliceが、Text::CSVの方が安全です。

#!/usr/bin/perl
use strict;
use warnings;

while (<>)
{
    my @cols = split /[|]/;
    if (scalar(@cols) == 25)
    {
        splice(@cols, 13, 0, '');
        $_ = join('|', @cols);
    }
    print;
}

これにより、目的の出力が生成されるようです。与えられた入力ファイル:

Z|432651242|987654321|XYZ|Abc|DEFEF||Abc-De-Fg|18|33221|Qwerty|18.06.3213|abc||123|Tepp|11.07.4443|2|||||4433322342344||
Z|432651242|987654321|XYZ|Abc|DEFEF||Abc-De-Fg|18|33221|Qwerty|18.06.3213|abc|def|123|Tepp|11.07.4443|2|||||4433322342344||

def(挿入が行われた場所を正確に確認できるように、2 行目の空のフィールドの代わりにある)、出力は次のようになります。

Z|432651242|987654321|XYZ|Abc|DEFEF||Abc-De-Fg|18|33221|Qwerty|18.06.3213|abc|||123|Tepp|11.07.4443|2|||||4433322342344||
Z|432651242|987654321|XYZ|Abc|DEFEF||Abc-De-Fg|18|33221|Qwerty|18.06.3213|abc||def|123|Tepp|11.07.4443|2|||||4433322342344||
于 2013-08-05T22:16:25.137 に答える
1

を使用Text::CSVして行を解析し、スプライスで空の行を挿入して、それを印刷できます。このようなものが動作するはずです:

use strict;
use warnings;
use Text::CSV;

my $csv = Text::CSV->new({
    sep_char => '|',
    eol      => $/,
});

while (my $row = $csv->getline(*ARGV)) {
    splice(@$row, 12, 0, '') if @$row == 25;
    $csv->print(*STDOUT, $row);
}
于 2013-08-05T21:07:21.077 に答える