#//
#//	DeleteVerticalComment.awk
#//
#//	抽選表の垂直コメントを削除するツール
#//
#//	* Sat Sep 24 21:37:23 JST 2016 Naoyuki Sawa
#//	- 1st リリース。
#//	  /clip/tool/DumpXlsx/keep/SplitDataAddr.awkを元にして作成しました。
#//	  DeleteVerticalComment.awkを直接実行せずに、DeleteVerticalComment.batから呼び出して使用して下さい。
#//
#//----------------------------------------------------------------------------
function die(s) {
	#//エラーメッセージを表示して終了します。
	print "### " s > "/dev/stderr"
	exit (_die_exit = 1)
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
END {
	#//die()経由ならば、ENDのアクションを実行せずに終了させます。
	#//- Awkの仕様: 引数付きのexit文を最初に実行し、その後で引数無しのexit文を実行すると、その前に使った引数が終了ステータスとして使われる。
	if(_die_exit) { exit }
}
#//ENDは複数定義出来ます。アプリケーション特有のENDを定義する場合は、ここよりも下で定義して下さい。
#//----------------------------------------------------------------------------
BEGIN {
	#//フィールドセパレータを、入出力共、カンマに変更する。
	FS = OFS = ","
}
#//----------------------------------------------------------------------------
#//フィールド文字列から、データ文字列と、(もし有れば)アドレス文字列を取得する。
function SplitDataAddr(s, a) {
	#//結果を格納する配列を確実に空にしておく。(必須ではないが安全のためです。)
	delete a
	#//フィールド文字列から、データ文字列と、(もし有れば)アドレス文字列を取得する。
	if(!match(s, /^([^"]+)( \".+\")?$/, a)) {
		die(FILENAME "(" FNR "," iCol "): フィールド文字列が不正です。(" s ")")
	}
}
#//----------------------------------------------------------------------------
/^:/ {
	#//新しい抽選表の開始時に、垂直コメント列のフラグをクリアする。
	#// - 一つの抽選表の、複数のブロックの切り替わりでは、垂直コメント列のフラグをクリアしない事に注意せよ。
	#//   クリアする方法も有りだとは思うのですが、当スクリプトでブロクの切り替わりを判断するのが難しいので、クリアしない事にしました。
	#//   実際にエクセル上で複数のブロックに分ける事は稀だと思うし、フラグがクリアされない事を前提の表構成にする事も可能だと思うので、これで問題無いと思います。
	delete aVerticalComment
}
#//----------------------------------------------------------------------------
{
	#//行コメントフラグをクリアしておく。q
	bComment = 0
	#//--- pass1 ---
	#//各フィールドについて…
	for(iCol = 1; iCol <= NF; iCol++) {
		#//フィールド文字列を取得する。
		s = $iCol
		#//空フィールドでなければ…
		if(s != "") {
			#//フィールド文字列から、データ文字列と、(もし有れば)アドレス文字列を取得する。
			SplitDataAddr(s, a)
			#//データ文字列を取得する。
			data = a[1]
		#//不要	#//(もし有れば)アドレス文字列を取得する。
		#//不要	addr = a[2]
			#//セルの文字列が"#",又は,"//"で開始していたら、行コメントの開始と見なす。
			if((data ~ /^#/) || (data ~ /^\/\//)) { bComment = 1 }
			#//行コメント内に、"#〜#"という文字列のセルが有れば、垂直コメント列のマークと見なす。
			#// - まだ行コメントが開始していなかった場合、"#〜#"は行コメントの開始と垂直コメント列のマークを兼ねます。
			if(data ~ /^#.*#$/) { aVerticalComment[iCol] = 1 }
		}
	}
	#//--- pass2 ---
	oCol = 0	#//この変数に、出力したフィールド数を数える。
	#//各フィールドについて…
	for(iCol = 1; iCol <= NF; iCol++) {
		#//フィールド文字列を取得する。
		s = $iCol
		#//空フィールドでなければ…
		if(s != "") {
			#//フィールド文字列から、データ文字列と、(もし有れば)アドレス文字列を取得する。
			SplitDataAddr(s, a)
			#//データ文字列を取得する。
			data = a[1]
		#//不要	#//(もし有れば)アドレス文字列を取得する。
		#//不要	addr = a[2]
			#//セルの文字列が"#",又は,"//"で開始していたら、行コメントの開始と見なし、これ以降のフィールドは出力不要です。
			if((data ~ /^#/) || (data ~ /^\/\//)) { break }
		}
		#//垂直コメント列でなければ…
		if(!(iCol in aVerticalComment)) {
			#//フィールドを前詰めで書き戻す。
			$(++oCol) = s
		}
	}
	#//フィールド数を切り詰める。
	NF = oCol
	#//空行でなければ、レコード文字列を出力する。
	if($0 !~ /^[[:blank:]]*$/) { print }
}
