プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやる

CSVファイル比較ツールが欲しい

二つのCSVファイルをカラム単位で比較してくれて、分かりやすい(紙出し出来る)形式で出力してくれるツールはないものか。
発端は、あるバッチプログラムの修正を行うことになったことです。
バッチプログラムは、
入力(ファイル)→プログラム→テーブル
というような構成になっているのですが、プログラムを修正するのであれば、

  • 入力(ファイル)→修正前プログラム→テーブル(修正前の結果)
  • 入力(ファイル)→修正後プログラム→テーブル(修正後の結果)

の二つを実施して、修正前後の結果テーブルの中身を比較・検証すべきだよね、と指摘されました。
で、テーブルの中身をCSVファイルに落とすツールは持っていたので(これまた、SQL*PlusでAccessでみるとNUMBER(18,3)が1E14とかになってしまう問題を回避したものだったりするのだが)、じゃあCSVファイルを比較すればいいねってことになりました。
が、ちょっと探してもない。画面上で比較できるツールはあったものの(名前忘れた)、比較結果を分かりやすく、かつ、印刷を意識したツールはなさそうでした。
仕方がないので、超々機能限定版を作ってみることに。
こんな感じになりました。(入力ファイル名が固定なのは、単なる手抜きだったりする)

Set fs = CreateObject("Scripting.FileSystemObject")
Set ts1 = fs.OpenTextFile("pre.txt")
Set ts2 = fs.OpenTextFile("post.txt")

While ts1.AtEndOfLine = False
	lineNum = ts1.Line
	line1 = ts1.readLine
	line2 = ts2.readLine

	line1Split = split(line1, ",")
	line2Split = split(line2, ",")

	WScript.Echo lineNum & ",修正前," & line1
	WScript.Echo lineNum & ",修正後," & line2

	diffLine = ""
	For i=0 to UBound(line1Split)
		If i <> 0 Then
			diffLine = diffLine & ","
		End If

		If line1Split(i) = line2Split(i) Then
			diffLine = diffLine & " "
		Else
			diffLine = diffLine & "×"
		End If
	Next
	WScript.Echo lineNum & ",比較," & diffLine
Wend

ts1.close
ts2.close

これを流すと、こんな感じになる。

・修正前ファイル
a,b,c,d,e
1,2,3,4,5

・修正後ファイル
a,b,c,d,f
1,2,5,4,5

・結果ファイル
1,修正前,a,b,c,d,e
1,修正後,a,b,c,d,f
1,比較, , , , ,×
2,修正前,1,2,3,4,5
2,修正後,1,2,5,4,5
2,比較, , ,×, , 

この結果ファイルをExcelとかに貼って、適当に加工してあげれば印刷にも耐えうるという、自分的には画期的なツールだったりします。
そもそも、この出力の形式って、汎用機のコンペアが出力する形式に似せたんですよね。意外にも(?)、まだまだパクれる良い習慣っていうのが、汎用系開発にはあるようです。
そんなわけで、もっとよさげなツールがあれば、ご紹介ください。よろしくお願いしますm(_ _)m