レコード連結(2)

複数行からなるデータを一つのレコードとしてまとめる
(要素数が可変の場合)

同等のawkプログラムへ

概要

レコード連結のページ では、要素数が固定されているため単純でした。 しかし、実際には以下のアンケート結果
住所:東京都世田谷区
性別:男
年齢:35
ペット:なし

住所:東京都渋谷区
性別:女
年齢:29
ペット:あり
種類:犬

住所:東京都目黒区
性別:男
年齢:42
ペット:あり
種類:カメ	

     :
     :
     :
のように、必須回答項目と任意項目の両方があるデータ( この場合、ペットを飼っている人のみペットの種類を答える) が集められることもあります。 このようなデータを
東京都世田谷区,男,35,なし
東京都渋谷区,女,29,あり,犬
東京都目黒区,男,42あり,カメ
     :
のように連結し、perlや表計算ソフトで処理しやすいようにする のがこのプログラムの目的です。

プログラム

この場合、元のデータは回答者ごとに 空行を入っていると仮定します。 プログラムは以下のようになります。 エディタを開き以下をタイプして、適当な名前でセーブしてください。ここでは ren2.pl という名前でセーブしたことにして話を進めます。
$juusho ="";
$seibetsu = "";
$nenrei = 0;
$pet = "";
$shurui = "";

while(<>) {
	s/[\r\n]//g;
	@field = split( /:/, $_ );

	if ( $field[0] eq "住所" ) {
		$juusho = $field[1];
	}

	if ( $field[0] eq "性別" ) {
		$seibetsu = $field[1];
	}

	if ( $field[0] eq "年齢" ) {
		$nenrei = $field[1];
	}

	if ( $field[0] eq "ペット" ) {
		$pet = $field[1];
	}

	if ( $field[0] eq "種類" ) {
		$shurui = $field[1];
	}

	if ( $_ eq "" ) {
		if ( $pet eq "なし" ) {
			printf( "%s,%s.%s,%s\n", $juusho, $seibetsu,
					$nenrei, $pet );
		}
		else {
			printf( "%s,%s.%s,%s,%s\n", $juusho, $seibetsu,
					$nenrei, $pet, $shurui );
		}
	}
}
exit;

入力データ

入力データは前述の、
住所:東京都世田谷区
性別:男
年齢:35
ペット:なし

住所:東京都渋谷区
性別:女
年齢:29
ペット:あり
種類:犬

住所:東京都目黒区
性別:男
年齢:42
ペット:あり
種類:カメ

というファイルが dat6.txt として存在するとします。

実行結果

OSは Windowsを利用していると 仮定します。 DOS prompt 上で、
c:\perl> perl ren2.pl dat6.txt
とタイプします。
東京都世田谷区,男,35,なし
東京都渋谷区,女,29,あり,犬
東京都目黒区,男,42,あり,カメ
と出力されるはずです。
メニューに戻る
Tkensaku

TKENSAKU top へ

Copyright © 2004 TKEN