ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:noname#64231 【Perl】テキストファイルの処理方法について
困り度:
  • 困っています
テキストファイルの一括処理をしたいです。
同じ形式で書かれている下記のような
ファイルが複数個あり全てのファイルの
同フィールドだけ抜き出し、
抜き出した全てのデータを右側列にコンマ区切りで並べて
出力させたいのですがうまく並べられません。
配列がうまく使えていないと思うのですが
アドバイスをいただけませんでしょうか。
データは&で区切られておりこの例では左から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,

希望結果のようなファイルを出力させたいです。
よろしくお願いします。
質問投稿日時:08/03/17 00:54
質問番号:3869465
この質問に対する回答は締め切られました。
最新から表示回答順に表示

回答

 

回答者:sakusaker7 質問にある条件だけならこんなのでも。

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

やっつけで書いたのでリファインの余地が大いにあります。
種類:回答
どんな人:経験者
自信:参考意見
回答日時:08/03/17 17:21
回答番号:No.2
この回答へのお礼ありがとうございました。
参考にさせていただきます。
お手数をおかけいたしました。

回答

 

回答者:Tacosan ん〜, 全データを一旦配列に入れておけばいいだけだと思うんだけどなぁ. そんなに難しくないと思う.
例えば $i 番目のファイルの $j 行目にある, $k 番目のデータを
$data[$I][$j][$k]
に入れる... とか.
現状どうなってるかわからんのでなんともアドバイスしにくいんだけど.
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/03/17 01:17
回答番号:No.1
この回答への補足ありがとうございます。
質問の書き方が漠然としており申し訳ありません。
なにぶんビギナーの為つまづいておりました。
助言のおかげでなんとかうまくいけそうです。
この回答へのお礼ありがとうございました。
 
最新から表示回答順に表示