プロが教える店舗&オフィスのセキュリティ対策術

テキストファイルの一括処理をしたいです。
同じ形式で書かれている下記のような
ファイルが複数個あり全てのファイルの
同フィールドだけ抜き出し、
抜き出した全てのデータを右側列にコンマ区切りで並べて
出力させたいのですがうまく並べられません。
配列がうまく使えていないと思うのですが
アドバイスをいただけませんでしょうか。
データは&で区切られておりこの例では左から3番目のフィールドを
処理の対象としてます。

file01
A&111&222&333&
A&444&555&666&
A&777&888&999&

file02
A&aaa&bb&cc&
A&ddd&ee&fff&
A&ggg&hhh&iiii&

file03
A&abab&bnb&ccc&
A&abab&bnb&ccc&
A&abab&bnb&ccc&
A&abab&bnb&ccc&

希望出力結果
222,bb,bnb,
555,ee,bnb,
888,hhh,bnb,
,,bnb,

希望結果のようなファイルを出力させたいです。
よろしくお願いします。

A 回答 (2件)

質問にある条件だけならこんなのでも。



#!/usr/bin/perl
use strict;
use warnings;
use Fatal qw(:void open close);

my $isep = '&';
my $osep = ',';

open my $fp1, '<', shift;
open my $fp2, '<', shift;
open my $fp3, '<', shift;

while (1) {
my $rec1 = <$fp1>;
my $rec2 = <$fp2>;
my $rec3 = <$fp3>;

last if !$rec1 && !$rec2 && !$rec3;

my @field1 = split $isep, $rec1 if $rec1;
my @field2 = split $isep, $rec2 if $rec2;
my @field3 = split $isep, $rec3 if $rec3;
my @of;

push @of, $rec1 ? $field1[2] : '';
push @of, $rec2 ? $field2[2] : '';
push @of, $rec3 ? $field3[2] : '';

print join($osep, @of), "\n";
}

実行結果:
222,bb,bnb
555,ee,bnb
888,hhh,bnb
,,bnb

やっつけで書いたのでリファインの余地が大いにあります。
    • good
    • 0
この回答へのお礼

ありがとうございました。
参考にさせていただきます。
お手数をおかけいたしました。

お礼日時:2008/03/20 13:49

ん~, 全データを一旦配列に入れておけばいいだけだと思うんだけどなぁ. そんなに難しくないと思う.


例えば $i 番目のファイルの $j 行目にある, $k 番目のデータを
$data[$I][$j][$k]
に入れる... とか.
現状どうなってるかわからんのでなんともアドバイスしにくいんだけど.

この回答への補足

ありがとうございます。
質問の書き方が漠然としており申し訳ありません。
なにぶんビギナーの為つまづいておりました。
助言のおかげでなんとかうまくいけそうです。

補足日時:2008/03/17 18:46
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2008/03/20 13:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!