【TeraTermマクロ】配列にあるデータの重複削除


この記事はプロモーションを含みます。

Linux

配列のデータを重複削除するコマンドが見つからなかったため、部品を作成してみました。

ソースコード

仕組みとしては単純で、重複削除対象の配列をループさせて、同じ値はスキップしつつ、別の配列に乗せ換えています。
TeraTermマクロでは配列の要素数を動的に変更出来ないようなので、重複削除対象の配列と同じ要素数の一時配列に乗せ換えつつ、重複削除後の配列の要素数を取得し、最後に適切な要素数の配列に乗せ換えています。

; 重複削除時の一時配列
strdim tmp_array num
tmp_num = 0
for i 0 num - 1
	for j 0 num - 1
		strmatch tmp_array[j] '.+'
		if result = 0 then
			tmp_array[j] = array_1[i]
			tmp_num = tmp_num + 1
			break
		else
			strcompare array_1[i] tmp_array[j]
			if result = 0 then
				break
			endif
		endif
	next
next

; 重複削除後の配列
strdim array_2 tmp_num
for i 0 tmp_num - 1
	array_2[i] = tmp_array[i]
next

使用方法

ここでは使用方法について説明します。
部品名は「array_deduplicate.ttl」としています。

呼び出し方

まず、重複削除元となる配列を準備します。
サンプルでは、配列名を「array_1」としています。
次に、「include ‘array_deduplicate.ttl’」で部品を呼び出すことで、
重複削除された配列「array_2」が作成されます。

; 引数1:配列(サイズは最大値を設定)
strdim array_1 65536
; グローバル変数
num = 0

; テスト用ファイル読み込み
fileopen file 'input.txt' 0 1
:startloop
filereadln file line
if result goto endloop
	array_1[num] = line
    num = num + 1
goto startloop
:endloop
fileclose file

include 'array_deduplicate.ttl'

; 重複削除の結果確認
fileopen file 'output.txt' 0
for i 0 tmp_num - 1
	filewriteln file array_2[i]
next
end

実行結果

テストで47都道府県を適当に並び替えて、配列最大サイズの65536件分準備しました。
これを処理したところ、1分程度掛かりました。
500件であれば、1秒も掛かりませんでした。

記事は以上になります。泥臭い感じですが、重複削除が出来たのでよしとしました。

コメント

タイトルとURLをコピーしました