レコード連結(2)

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

同等のperlプログラムへ

概要

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

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

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

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

プログラム

この場合、元のデータは回答者ごとに 空行を入っていると仮定します。 プログラムは以下のようになります。 エディタを開き以下をタイプして、適当な名前でセーブしてください。ここでは ren2.awk という名前でセーブしたことにして話を進めます。
BEGIN {
	FS = ":";
	JUUSHO = "";
	SEIBETSU = "";
	NENREI = 0;
	PET = "";
	SHURUI = "";
}
{

	if ( $1 == "住所" ) {
		JUUSHO = $2;
	}
		
	if ( $1 == "性別" ) {
		SEIBETSU = $2;
	}

	if ( $1 == "年齢" ) {
		NENREI = $2;
	}

	if ( $1 == "ペット" ) {
		PET = $2;
	}

	if ( $1 == "種類" ) {
		SHURUI = $2;
	}

	if ( $0 == "" ) {
		if ( PET == "なし" ) {
			printf( "%s,%s,%s,%s\n", JUUSHO, SEIBETSU, NENREI,PET );
		}
		else {
			printf( "%s,%s,%s,%s,%s\n", JUUSHO, SEIBETSU, NENREI,PET, SHURUI );
		}
	}

}

入力データ

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

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

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

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

実行結果

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

TKENSAKU top へ

Copyright © 2004 TKEN