ファイル内のテキスト一覧に同じ文字列があった場合に重複文字を削除する方法
こんにちは。thimiです。
今日は、ファイル内に同じ文字列があった場合に削除する方法です。
下記のようなファイル一覧があるとします。
※今回ご紹介する方法は、ソートされている必要があるため
使用するファイルはソートしてください。
◆ソート方法はこちら
https://thimi-lifehack.com/sort1/
https://thimi-lifehack.com/sort2/
同じ文字列の行を削除したい場合は、バッチファイルを下記のように記載します。
※for文の二重ループを使っています。
delete_list.bat | |
---|---|
@echo off | コマンドプロンプトへ非表示 |
rem ファイルが存在していれば、削除 | rem:コメント(覚書記載) |
if exist delete_list2.csv del elete_list2.csv | 既にファイルがある場合は一度削除する処理 |
setlocal enabledelayedexpansion | for文の中で値を変更したいため、遅延環境変数を使うための宣言 |
rem 変数「n」を初期化 | rem:コメント(覚書記載) |
set i=0 | for文をiの変数でループ処理するために初期化 |
rem 「delete_list.csv」ファイルを1行ずつ読み込む | rem:コメント(覚書記載) |
for /f %%a in (delete_list.csv) do ( | delete_list.csvファイルを一行ずつ読み込む |
rem 変数「i」に+1 | rem:コメント(覚書記載) |
set /a i=!i!+1 | 次の文字列確認(i+1) |
rem 変数「j」を初期化 | rem:コメント(覚書記載) |
set j=0 | for文をjの変数でループ処理するために初期化 |
rem 変数「flag」を1で初期化 | rem:コメント(覚書記載) |
set flag=1 | 文字列重複判断をflagで判断するために初期化 |
※重複している場合は、flag=0が設定されている | |
rem 「delete_list.csv」ファイルを1行ずつ読み込む | rem:コメント(覚書記載) |
for /F %%b in (delete_list.csv) do ( | delete_list.csvファイルを一行ずつ読み込む |
rem 変数「j」に+1 | rem:コメント(覚書記載) |
set /a j=!j!+1 | 次の文字列確認(j+1) |
rem 同じ文字列の行があれば、「flag」に0を代入 | rem:コメント(覚書記載) |
if !j! lss !i! (if %%a == %%b ( set flag=0 ))) | 二重ループのjを回して、iと比較する |
※jはiより小さい場合だけチェック | |
rem 同じ文字列ががない場合、「delete_list2.csv」ファイルに書き出し | rem:コメント(覚書記載) |
if !flag! equ 1 echo %%a> delete_list2.csv | flag=1の場合だけ、delete_list2.csvへ書き出し |
) | |
endlocal | ローカル変数使用終了(省略可) |
exit | 終了処理(省略可) |
バッチファイルの内容を簡単に説明します。
「setlocal enabledelayedexpansion」コマンド
遅延環境変数のコマンドです。
値を実行するときに読み込むときに使います。設定した値を使うときは、
変数を「!」で囲みます。
「set」コマンド
実行中の環境変数の値を設定します。
「for」コマンド
ループ処理コマンドです。
オプションとして「/f」を追加することで、テキストファイル内の文章を
取り出して代入しています。
「if」コマンド
条件文コマンドです。
1つ目のif文では、jの変数がiの変数よりも小さい、かつ「%%a」と「%%b」を比較して同じだったらflagに0を設定しますという条件文です。
2つ目のif文では、flag=1だったらファイルに書き出すという条件文です。
実行すると下記結果となります。
※比較演算子は用途によって使い分けてください。
equ 等しい(=)
neq 等しくない(≠)
gtr より大きい(>)
geq 以上(≧)
leq 以下(≦)
lss 未満(<)