2011-02-06 7 views
8

私は固定幅フィールドを持つテキストファイルをたくさん持っている:解析固定幅ファイル

<c>  <c>  <c> 
Dave Thomas 123 Main 
Dan  Anderson 456 Center 
Wilma Rainbow 789 Street 

ファイルの残りの部分は<c>が列の先頭をマークします同様の形式であるが、彼らはさまざまな(未知の)列の幅が&です。これらのファイルを解析する最良の方法は何ですか?

私はText::CSVを使用してみましたが、何の区切り文字がありませんので、(私はモジュールの間違ったを使用していない場合)には、一貫性のある結果を得るのは難しい:

my $csv = Text::CSV->new(); 
$csv->sep_char (' '); 

while (<FILE>){ 
    if ($csv->parse($_)) { 
     my @columns=$csv->fields(); 
     print $columns[1] . "\n"; 
    } 
} 
+1

「解析」タグになぜ反対しますか?これは解析の問題です。あなたがPerlで解決策を必要としているということは、それが解析の問題ではないということを意味するわけではありません。 – zwol

+0

私は一般的な解決策を望んでいないので、 –

+0

多分私は誤解されているかもしれません...私はそこに "解析"を入れて私の状況(すなわち、Python、PHPなど)に関連しないソリューションの全体をもたらすだろうと思った.. ..thx –

答えて

12

user604939に記載されているように、unpackは固定幅フィールドに使用するツールです。ただし、unpackにはテンプレートを渡す必要があります。あなたはフィールドの幅を変更することができると言うので、解決策は、あなたのファイルの最初の行から、このテンプレートを構築することです:

my @template = map {'A'.length}  # convert each to 'A##' 
       <DATA> =~ /(\S+\s*)/g; # split first line into segments 
$template[-1] = 'A*';     # set the last segment to be slurpy 

my $template = "@template"; 
print "template: $template\n"; 

my @data; 
while (<DATA>) { 
    push @data, [unpack $template, $_] 
} 

use Data::Dumper; 

print Dumper \@data; 

__DATA__ 
<c>  <c>  <c> 
Dave Thomas 123 Main 
Dan  Anderson 456 Center 
Wilma Rainbow 789 Street 

印刷した:救助へ

 
template: A8 A10 A* 
$VAR1 = [ 
      [ 
      'Dave', 
      'Thomas', 
      '123 Main' 
      ], 
      [ 
      'Dan', 
      'Anderson', 
      '456 Center' 
      ], 
      [ 
      'Wilma', 
      'Rainbow', 
      '789 Street' 
      ] 
     ]; 
+0

@random_months_later_downvoter =>理由を教えてください。 –

3

ちょうどPerlのunpack関数を使用します。このような何か:

while (<FILE>) { 
    my ($first,$last,$street) = unpack("A9A25A50",$_); 

    <Do something ....> 
} 

アンパックテンプレート、「###」の内側には、あなたが混在するために使用できる他のさまざまな形式がありますが、各A. のフィールドの幅を置くことができますし、整数フィールドなどと一致します。 ファイルがメインフレームファイルのように固定幅である場合は、これが最も簡単になります。

+0

私の質問の一部です...フィールドの幅は、私がそれをフィードするファイルに応じて変更されます。解凍してヘッダから幅を検出する方法はありますか? –

6

CPAN!

DataExtract::FixedWidth固定幅のファイルを解析するだけでなく、(PODに基づいて)ヘッダー行から列幅を計算するのに十分スマートであるように見えます。

+0

+1よくあるご指摘:-) –

+0

ところで、著者はここにいるので、しばらくお待ちしています。 – DVK

+0

DVK ++ =)ありがとう! DE:FWも[テスト入力数トン]で十分にテストされています。(http://api.metacpan.org/source/ECARROLL/DataExtract-FixedWidth-0.09/t/data/) –