1

大きなバイナリ ファイル ($data) の抜粋は次のようになります。

\n1ax943021C               xxx\t2447\t5
\n1ax951605B               yyy\t10400\t6
\n1ax919275  G2L           zzz\t6845\t6

最初の 25 文字には、スペースで埋められた記事番号が含まれています。記事番号と次の列の間のすべてのスペースを \x09 に変換するにはどうすればよいですか? 記事番号の異なる部分の間の 1 つ以上のスペースに注意してください。

回避策を試しましたが、それでは記事番号が「.{25}xxx»」で上書きされてしまいます

$data =~ s/\n.{25}/\n.{25}xxx/g

誰でも助けることができますか?

本当にありがとう!

ゲイリー

4

4 に答える 4

2

unpack固定幅データに使用できます。

use strict;
use warnings;
use Data::Dumper;

$Data::Dumper::Useqq=1;
print Dumper $_ for map join("\t", unpack("A25A*")), <DATA>;

__DATA__
1ax943021C               xxx    2447    5
1ax951605B               yyy    10400   6
1ax919275  G2L           zzz    6845    6

出力:

$VAR1 = "1ax943021C\txxx\t2447\t5";
$VAR1 = "1ax951605B\tyyy\t10400\t6";
$VAR1 = "1ax919275  G2L\tzzz\t6845\t6";

Data::DumperUseqqオプションは、エスケープされた形式で白い文字を出力することに注意してください。

基本的にここで行うことは、各行を取り出して展開し、スペースで埋められたテキストの 2 つの文字列 (余分なスペースをすべて削除する) を使用し、これらの文字列をタブで結合して印刷することです。これにより、最後の文字列内のスペースが保持されることにも注意してください。

于 2013-08-23T09:30:40.333 に答える
0

何が正確かわかりません-これは2つの列に一致し、それらを印刷します-すべての元のスペースを使用します。希望の出力を教えてください。修正します...

#!/usr/bin/perl -w
use strict; 

my @file = ('\n1ax943021C               xxx\t2447\t5', '\n1ax951605B               yyy\t10400\t6',
'\n1ax919275  G2L           zzz\t6845\t6');

foreach (@file) {
    my ($match1, $match2) = ($_ =~ /(\\n.{25})(.*)/);
    print "$match1'[insertsomethinghere]'$match2\n";
}

出力:

\n1ax943021C               '[insertsomethinghere]'xxx\t2447\t5
\n1ax951605B               '[insertsomethinghere]'yyy\t10400\t6
\n1ax919275  G2L           '[insertsomethinghere]'zzz\t6845\t6
于 2013-08-23T09:29:21.367 に答える
0

試してみてください:

$data =~ s/ +/\t/g;
于 2013-08-23T09:10:37.997 に答える