- ベストアンサー
複数テキストファイルの内容を、一括で重複行の削除がしたい
複数のテキストファイルの内容で重複する行を、一括削除をするのに便利なツールはありますでしょうか? 色々と探しても一括でしてくれるソフトが見当たりません。 どなたか教えていただければ幸いです。 例)以下のようなテキストファイル内容が複数あって・・ あああ いい かかか ううううう いい ええええ ↓↓ 実行すると・・ あああ いい かかか ううううう ええええ 重複した一方のみ残すというイメージです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.3です。 > 元のファイル内容の「改行」がなくなってしまうんです。 それは、改行だけの行も重複していれば 重複行とみなしてしまうように作ってあるからです。 だから最初の改行だけの行だけは残っていたはずですよ^^; > あとはファイル名に拡張子が2つ付いてしまいました。 これは間違って元のファイルを台無しにしないよう、 念のため別のファイルに保存するようにしたからです。 改行だけの行はそのままなくならないようにして、 ファイルは上書きするように変更してみました。 今度のは元のファイルを上書きしてしまうので、 実行前には必ずバックアップを取っておいてくださいね。 '空行無視、ファイル上書き '---ここから--- Option Explicit On Error Resume Next Dim iCounter Dim oParam Set oParam=WScript.Arguments For iCounter=0 To oParam.Count-1 Call procDelDupFromFile(oParam(iCounter)) Next Set oParam=Nothing On Error GoTo 0 Sub procDelDupFromFile(sFileName) Dim oFileSystem Dim oFile Dim sLines() Dim iCounter Set oFileSystem=WScript.CreateObject("Scripting.FileSystemObject") If Err.Number=0 Then Set oFile=oFileSystem.OpenTextFile(sFileName) If Err.Number=0 Then iCounter=0 Do While oFile.AtEndOfStream<>True ReDim Preserve sLines(iCounter+1) sLines(iCounter)=oFile.ReadLine iCounter=iCounter+1 Loop oFile.Close End If End If Call procWriteFile(sFileName,sLines) Set oFileSystem=Nothing Set oFile=Nothing Set sLines=Nothing End Sub Sub procWriteFile(sFileName,sLines) Dim sUniqFileName Dim oUniqFileSystem Dim oUniqFile Dim bFilter Dim iCounter Set oUniqFileSystem=WScript.CreateObject("Scripting.FileSystemObject") If Err.Number=0 Then Set oUniqFile=oUniqFileSystem.OpenTextFile(sFileName,2,True) If Err.Number=0 Then For iCounter=0 to UBound(sLines)-1 bFilter=procDupFilter(iCounter,sLines) If bFilter Then oUniqFile.Write(sLines(iCounter)) oUniqFile.Write(vbCrLf) End If Next oUniqFile.Close End If End If Set bFilter=Nothing Set sUniqFileName=Nothing Set oUniqFileSystem=Nothing Set oUniqFile=Nothing End Sub Function procDupFilter(iIndex,sLines) Dim sLine Dim iCounter sLine=sLines(iIndex) procDupFilter=True For iCounter=iIndex-1 to LBound(sLines) Step -1 If (StrComp(sLine,"")<>0) And (StrComp(sLine,sLines(iCounter))=0) Then procDupFilter=False Exit For End If Next Set sLine=Nothing End Function '---ここまで---
その他の回答 (3)
- nknk80
- ベストアンサー率65% (17/26)
スクリプトの勉強をかねて作ってみました。 簡単な動作確認はしましたが、使う場合には確認してください。 下記内容をテキストファイル(拡張子は".vbs")で保存して重複行を削除したい ファイルをドラッグ&ドロップすると重複行が削除されると思います。 何も工夫せずに作ったので、大きなファイルの処理には時間がかかります。 '---ここから切り取ってください--- Option Explicit Dim oParam Set oParam=WScript.Arguments Dim iCounter For iCounter=0 To oParam.Count-1 Call procReadFile(iCounter) Next Set oParam=Nothing Sub procReadFile(iFileNum) On Error Resume Next Dim sFileName Dim oFileSystem Dim oFile Dim sLines() Dim iCounter sFileName=oParam(iFileNum) Set oFileSystem=WScript.CreateObject("Scripting.FileSystemObject") If Err.Number=0 Then Set oFile=oFileSystem.OpenTextFile(sFileName) If Err.Number=0 Then iCounter=0 Do While oFile.AtEndOfStream<>True ReDim Preserve sLines(iCounter+1) sLines(iCounter)=oFile.ReadLine iCounter=iCounter+1 Loop oFile.Close End If End If Call procWriteFile(sFileName,sLines) Set sFileName=Nothing Set oFileSystem=Nothing Set oFile=Nothing Set sLines=Nothing End Sub Sub procWriteFile(sFileName,sLines) Dim sUniqFileName Dim oUniqFileSystem Dim oUniqFile Dim bFilter Dim iCounter Set oUniqFileSystem=WScript.CreateObject("Scripting.FileSystemObject") If Err.Number=0 Then Set oUniqFile=oUniqFileSystem.OpenTextFile(sFileName+".txt",2,True) If Err.Number=0 Then For iCounter=0 to UBound(sLines)-1 bFilter=procDupFilter(iCounter,sLines) If bFilter Then oUniqFile.Write(sLines(iCounter)) oUniqFile.Write(vbCrLf) End If Next oUniqFile.Close End If End If Set bFilter=Nothing Set sUniqFileName=Nothing Set oUniqFileSystem=Nothing Set oUniqFile=Nothing End Sub Function procDupFilter(iIndex,sLines) Dim sLine Dim iCounter sLine=sLines(iIndex) procDupFilter=True For iCounter=iIndex-1 to LBound(sLines) Step -1 If StrComp(sLine,sLines(iCounter))=0 Then procDupFilter=False Exit For End If Next End Function '---ここまで---
お礼
nknk80さん、ありがとうございます! ちゃんと動いているみたいです。びっくりしました^^; お心遣い、大変感謝致します<(_ _)> ただいくつか問題が。。 確かに重複行は削除されたのですが 元のファイル内容の「改行」がなくなってしまうんです。 例) ああああああです。 ええええ いいいいです。 ううううううううです。 ええええ おおおおおです。 ↓↓↓ (スクリプト実行後) ああああああです。 ええええ いいいいです。 ←(元の改行がなくなって、全部くっついてしまう) ううううううううです。 おおおおおです。 あとはファイル名に拡張子が2つ付いてしまいました。 例) あああ.txt いい.txt ううううう.txt ↓↓↓ (スクリプト実行後) あああ.txt.txt いい.txt.txt ううううう.txt.txt 大変恐縮なのですが もし可能でしたら、修正していただけたら幸いです。
- celtis
- ベストアンサー率70% (2358/3332)
ツールやマクロなどで実現できるかもしれません。 事前にソートして重複行を隣接させないといけないとか、いろいろ制約があるものもあります。 http://www.forest.impress.co.jp/article/2008/05/28/textsorter.html http://www.fpcu.jp/dosvcmd/bbs/log/findfindstrsort/4-0919.html http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1112730971 http://park7.wakwak.com/~sawaboh/program/textedit/index.html#kinou_B
お礼
textsorterは使ってみましたが、複数ファイルには対応していないようです。 プロンプトというのは分かりませんでした。 1フォルダ内(サブフォルダ含む)のテキストファイルを一括で重複行削除! というようなマクロがあればいいんですが。。誰か作ってくれないかな^^; お返事ありがとうございました。
- u-bot
- ベストアンサー率58% (1736/2988)
誰も回答しないようなので・・・。 そのような特殊用途なツールは多分無いと思います。 行の順番を変更しても良いなら、UNIXコマンドでsortしてからuniqコマンドで削除できますが・・・。 このような作業は自分でC言語なりスクリプト言語(JAVA, perl, Ruby等)で専用プログラムを作るしかないと思います。 今後も同じような作業があるならば、スクリプト言語を覚えて損は無いと思います。
お礼
スクリプト言語というのはプログラムのようですね。 かなり難しそうです^^;お返事ありがとうございます。
お礼
nknk80さん、返信ありがとうございます! > それは、改行だけの行も重複していれば > 重複行とみなしてしまうように作ってあるからです。 > だから最初の改行だけの行だけは残っていたはずですよ^^; なるほど、見えない改行も重複の対象になるんですね~ 実行してみたら・・・キレイにできました~!^^ いやーずいぶんと作業が楽になりました。 プログラムって便利ですねぇ。 ありがとうございました~<(_ _)>