ファイル内の重複した行を削除する
ファイル内に書かれたリストなどの重複行を削除してスッキリ
何かのリストが書かれたファイルであれば、ファイルの行数を数えればリストに載っているものの総数が分かるのですが、リストの中で重複している行があるとそうはならないため不便を覚えることが多々あります。その他の目的でもファイル内容の重複行を削除したいときがあるでしょう。
しかし、ファイル内容が膨大であれば目で見て重複行を削除するのは非常に難しいですし、膨大な時間もかかってしまいます。そこで、今回はファイル内に書かれた単語や文を読み取って、重複する行を削除するパソコン作業の自動化を行っていきます。
プログラムはWindowsコマンドプロンプトというWindowsにデフォルトで搭載されているものを使用します。ですので、インストールなどの手間はありませんのでご安心ください。それどころか使うだけであれば2分もあれば十分です。
・Windowsバッチファイルでファイル内容の操作に興味のある人
とりあえず、コピー&ペーストでプログラムを作る
まずは、コピー&ペーストでプログラムを作ってみましょう。「重複行削除.bat」というファイルを作成して中身に以下のコードを書き込みましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
@echo off rem ファイル名を取得 set filename=%~n1 rem 拡張子を取得 set extension=%~x1 rem 新しいファイル名 set newfilename=%filename%_new.%extension% rem 「new.txt」ファイルが存在していれば、削除する if exist %newfilename% del %newfilename% rem for文内で変数を変化させるためのもの setlocal enabledelayedexpansion rem 変数「n」に0を代入 rem 以下のforループでファイルを何行目まで読み込んだかが入る set n=0 rem ファイル内容を1行ずつ読み込む for /f %%a in (%1) do ( rem 変数「n」に1を足す set /a n=!n!+1 rem 変数「m」に0を代入 rem 以下のforループでファイルの何行目まで読み込んだかが入る set m=0 rem 変数「write」に1を代入 rem 内容が重複しているかどうかの情報が入る set write=1 rem 再びファイルを1行ずつ読み込む for /f %%b in (%1) do ( rem 変数「m」に1を足す set /a m=!m!+1 rem ループ内で、読み込んだ場所までに重複している行があれば、「write」に0を代入 if !m! lss !n! ( if %%a == %%b ( set write=0 ) ) ) rem 重複行がなければ(変数「write=1」)、「new.txt」ファイルに書き出す if !write! equ 1 echo %%a >> %newfilename% ) rem for文内で変数を変化させるためのもの endlocal |
少し長いコードですね。でも後から解説するようにやっていることは非常に単純ですよ。今はとにかく使ってみましょう。書き込んだら保存してファイルを閉じます。これでプログラムは完成です。
続いてテスト用のファイルを作ります。これは自分で作ったファイルでもよいですよ。ここでは、下の画像に示すような神社の名前を書いたリストファイルをテストとして用意しました。
【神社リスト.txt】
このリストを使いたい方は、以下をコピー&ペーストしてファイルを作ってください。
狭井神社(奈良県)
佐嘉神社(佐賀県佐賀市)
坂田神明宮(滋賀県米原市)
西寒田神社(大分県)
酒列磯前神社(茨城県ひたちなか市)
佐川龍馬神社(高知県佐川町)
佐嘉神社(佐賀県佐賀市)
前鳥神社(神奈川県平塚市)
佐久奈度神社(滋賀県大津市)
沙沙貴神社(滋賀県近江八幡市安土町常楽寺)
西寒田神社(大分県)
桜谷神社(福岡県糸島市)
細石神社(福岡県糸島市)
佐太神社(島根県松江市)
寒川神社(神奈川県寒川町)
前鳥神社(神奈川県平塚市)
佐太神社(島根県松江市)
猿賀神社(青森県平川市)
このファイルには重複している行が多数存在します。この程度の量のリストでも人間の目で探そうとするとかなり苦労することが分かりますよね。
では、このファイルを「重複行削除.bat」の上にドラッグ&ドロップしてみましょう。すると新しいファイル「重複行削除_new.bat」が作成されたと思います。これが重複行を除いたファイルであり、ファイル名は元のファイル名の後に「_new」が付くようにしています。では中を見てみましょう。
【神社リスト_new.txt】
「神社リスト.txt」ファイルと見比べると行数が少なくなっており、重複行が削除されていることが分かります。
では、次節でプログラム内で何をしているのかをザクッリと見ていきましょう。
プログラムでやっていることをザックリと理解しよう
「重複行削除.bat」は少々長いプログラムでしたので、ここでもう一度示しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
@echo off rem ファイル名を取得 set filename=%~n1 rem 拡張子を取得 set extension=%~x1 rem 新しいファイル名 set newfilename=%filename%_new.%extension% rem 「new.txt」ファイルが存在していれば、削除する if exist %newfilename% del %newfilename% rem for文内で変数を変化させるためのもの setlocal enabledelayedexpansion rem 変数「n」に0を代入 rem 以下のforループでファイルを何行目まで読み込んだかが入る set n=0 rem ファイル内容を1行ずつ読み込む for /f %%a in (%1) do ( rem 変数「n」に1を足す set /a n=!n!+1 rem 変数「m」に0を代入 rem 以下のforループでファイルの何行目まで読み込んだかが入る set m=0 rem 変数「write」に1を代入 rem 内容が重複しているかどうかの情報が入る set write=1 rem 再びファイルを1行ずつ読み込む for /f %%b in (%1) do ( rem 変数「m」に1を足す set /a m=!m!+1 rem ループ内で、読み込んだ場所までに重複している行があれば、「write」に0を代入 if !m! lss !n! ( if %%a == %%b ( set write=0 ) ) ) rem 重複行がなければ(変数「write=1」)、「new.txt」ファイルに書き出す if !write! equ 1 echo %%a >> %newfilename% ) rem for文内で変数を変化させるためのもの endlocal |
詳しい説明は専門書や専門サイトに任せて、ここではザックリと何をやっているかだけを説明します。
まず、3行目から8行目は処理の対象ファイルからファイル名と拡張子の情報を取り出し、新しく作成するファイルの名前を決めています。11行目はその新しく作成するファイル名が既に存在していたら、削除するコマンドです。
少し飛ばして、21行目です。ここから49行目まではループ文と呼ばれるコマンドにより、ファイルの内容を1行ずつ「%%a」という変数に代入しながら、ファイルの最後に達するまで、この中のコマンドを繰り返し実行します。このループを外側ループと呼びましょう。
さらに35行目から44行目もループ文になっており、ループの中にループが入っている状態です。こちらのループは内側ループと呼びます。
何をしているかというと、外側ループでファイルの1行目の文を読み込み、それをさらに内側ループでファイルを全行文ループさせて自分自身のファイル内容を一行ずつ比較しているのです。そして、次は外側ループで2行目の文を読み込み、それを内側ループで全行と比較しています。そして、…
という感じですべての行に対して同じ行が他に存在していないかをチェックしているのです。重複がない場合にだけ、47行目でその行を新しいファイルに書き出しています。
ザックリですかこれがこのプログラムの概要です。
おわり
どうだったでしょうか?プログラムの内容は少し高度だったかもしれません。しかし、このようなプログラムでも少し学べば十分に書けるようになります。自分でパソコン操作の自動化プログラムを書くことができれば、嫌さ作業もむしろ楽しくなることだってあります。
周りが手作業でせっせとやっているところを自分だけはクリック一つで終わらせる。そして、その作業スピードは数倍程度ではありません。数十倍にだってすることが可能です。
パソコン作業の自動化に興味のある方は一度体験レッスンを受けてみませんか?プログラミングなんてしたことがないという方でも問題ありません。むしろそのような方へ向けての講座です。詳しくはこちらからどうぞ→「無料体験レッスンの詳細を見る」。
自動化プログラムの作成を依頼しませんか?
幣サイトでは、Windowsパソコンの自動化プログラムの作成サービスを行っています。
本サービスの特徴は、
・安価な値段
・個人から法人までどなたでも対応
・お客様の要望を全力で実現
です。
安いからといって、決して手は抜きません。
まずは、下のボタンからWindowsパソコンの自動化プログラムの作成サービスの詳細をご確認ください。