dポイントプレゼントキャンペーン実施中!

複数のテキストファイルの内容で重複する行を、一括削除をするのに便利なツールはありますでしょうか?

色々と探しても一括でしてくれるソフトが見当たりません。
どなたか教えていただければ幸いです。

例)以下のようなテキストファイル内容が複数あって・・

あああ
いい
かかか
ううううう
いい
ええええ

 ↓↓  実行すると・・

あああ
いい
かかか
ううううう
ええええ

重複した一方のみ残すというイメージです。

A 回答 (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
'---ここまで---
    • good
    • 1
この回答へのお礼

nknk80さん、返信ありがとうございます!

> それは、改行だけの行も重複していれば
> 重複行とみなしてしまうように作ってあるからです。
> だから最初の改行だけの行だけは残っていたはずですよ^^;

なるほど、見えない改行も重複の対象になるんですね~


実行してみたら・・・キレイにできました~!^^

いやーずいぶんと作業が楽になりました。
プログラムって便利ですねぇ。

ありがとうございました~<(_ _)>

お礼日時:2008/06/26 01:14

スクリプトの勉強をかねて作ってみました。


簡単な動作確認はしましたが、使う場合には確認してください。
下記内容をテキストファイル(拡張子は".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
'---ここまで---
    • good
    • 1
この回答へのお礼

nknk80さん、ありがとうございます!
ちゃんと動いているみたいです。びっくりしました^^;
お心遣い、大変感謝致します<(_ _)>


ただいくつか問題が。。

確かに重複行は削除されたのですが
元のファイル内容の「改行」がなくなってしまうんです。

例)

ああああああです。
ええええ
いいいいです。

ううううううううです。
ええええ
おおおおおです。

↓↓↓ (スクリプト実行後)

ああああああです。
ええええ
いいいいです。     ←(元の改行がなくなって、全部くっついてしまう)
ううううううううです。
おおおおおです。


あとはファイル名に拡張子が2つ付いてしまいました。

例)

あああ.txt
いい.txt
ううううう.txt

↓↓↓ (スクリプト実行後)

あああ.txt.txt
いい.txt.txt
ううううう.txt.txt


大変恐縮なのですが
もし可能でしたら、修正していただけたら幸いです。

お礼日時:2008/06/24 18:25

ツールやマクロなどで実現できるかもしれません。


事前にソートして重複行を隣接させないといけないとか、いろいろ制約があるものもあります。
http://www.forest.impress.co.jp/article/2008/05/ …
http://www.fpcu.jp/dosvcmd/bbs/log/findfindstrso …
http://detail.chiebukuro.yahoo.co.jp/qa/question …
http://park7.wakwak.com/~sawaboh/program/textedi …
    • good
    • 0
この回答へのお礼

textsorterは使ってみましたが、複数ファイルには対応していないようです。
プロンプトというのは分かりませんでした。

1フォルダ内(サブフォルダ含む)のテキストファイルを一括で重複行削除!
というようなマクロがあればいいんですが。。誰か作ってくれないかな^^;

お返事ありがとうございました。

お礼日時:2008/06/23 20:27

誰も回答しないようなので・・・。



そのような特殊用途なツールは多分無いと思います。
行の順番を変更しても良いなら、UNIXコマンドでsortしてからuniqコマンドで削除できますが・・・。

このような作業は自分でC言語なりスクリプト言語(JAVA, perl, Ruby等)で専用プログラムを作るしかないと思います。
今後も同じような作業があるならば、スクリプト言語を覚えて損は無いと思います。
    • good
    • 0
この回答へのお礼

スクリプト言語というのはプログラムのようですね。
かなり難しそうです^^;お返事ありがとうございます。

お礼日時:2008/06/23 20:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!