No.5ベストアンサー
- 回答日時:
>重複データを削除するためにMSDN のDictionary を使うと簡単なようなのですが、
それは、あまり、スピードに関しては速くありません。Dictionary(ハッシュ)は、アルゴリズムが簡単だということだけです。今回は、テキストファイルで、元が1次元配列で取れるものを、わざわざ、ハッシュ形式で取る必要がありません。どうしても知りたければ、また書きます。
それから、上書きするプログラムは作れるのですが、マニュアル操作ならともかく、一瞬の間にしてしまうので、万が一を考えると、それはできませんでした。
以下のコードから、
'Kill myFile '元のファイルを削除する
'Call RenamePro '名前変更プログラム
の2つのコメント記号「'」(ダッシュ) を両方外せば、そのまま、コードが走ります。
ファイルは、複数選ぶことが出来ます。そのままですと、完成したものには、
_[filename].txt となります。(「_」(アンダーバー)が付く。必ず、テキストファイルであることに限ります。)なお、空白行は、出力されません。
元のファイルを移動するなりしてから、RenamePrc を実行してください。
万が一に備えて、必ずバックアップをしてから行ってください。
'-----------------------------------------------
'ユニークを出力するプログラム
'-----------------------------------------------
Option Explicit
Sub UniqTextPrc()
Dim myData() As String
Dim myStock() As String
Dim Filenames As Variant
Dim myFile As Variant
Dim myOutFile As String
Dim inFileNo As Integer
Dim outFileNo As Integer
Dim TextLine As String
Dim i As Long, j As Long, k As Long, N As Long
'テキストファイルが置いてある場所
Const myPath As String = "C:\My Documents\" '設定してください。
ChDir myPath
'複数のファイルを選ぶことが出来ます。
Filenames = Application.GetOpenFilename _
("テキスト(*.txt),*.txt", MultiSelect:=True)
If VarType(Filenames) = vbBoolean Then Exit Sub
On Error GoTo ErrHandler
For Each myFile In Filenames
'ファイルは、開いている間は、上書きすることが出来ません。
myOutFile = Left(myFile, InStrRev(myFile, "\")) & "_" & _
Mid(myFile, InStrRev(myFile, "\") + 1)
inFileNo = FreeFile
Open myFile For Input As #inFileNo
outFileNo = FreeFile
Open myOutFile For Output As #outFileNo
'
Do While Not EOF(1)
Line Input #inFileNo, TextLine
ReDim Preserve myData(i)
myData(i) = TextLine
i = i + 1
Loop
Close #inFileNo
'ユニークを取り出す
ReDim myStock(0)
N = UBound(myData)
myStock(0) = myData(0)
k = 0
'
For i = 0 To N
For j = 0 To k
If myData(i) = myStock(j) Then
Exit For
ElseIf j = k Then
k = k + 1
ReDim Preserve myStock(0 To k)
myStock(k) = myData(i)
'ファイルの出力
If myStock(k) <> "" Then '空白行を抜く
Print #outFileNo, myStock(k)
End If
End If
Next j
Next i
Close #outFileNo
Erase myData(): Erase myStock()
'Kill myFile '元のファイルを削除する
'
Next
ErrHandler:
If Err.Number > 0 Then
MsgBox Err.Description, 16
Else
'Call RenamePro '名前変更プログラム
MsgBox "正常終了しました。", 64
End If
End Sub
'-----------------------------------------------
'名前変更プログラム
'-----------------------------------------------
Sub RenamePrc()
'オリジナルの元ファイルが、同じフォルダにあると、働きません。移動などしてください。
'名前変更プログラム
Dim myFile As String
Const myPath As String = "C:\My Documents\" '設定してください。
myFile = Dir(myPath & "_*.txt")
On Error Resume Next
Do While myFile <> ""
Name myFile As Left(myFile, InStrRev(myFile, "\")) & _
Mid(myFile, InStrRev(myFile, "\") + 2)
myFile = Dir()
Loop
End Sub
信じられないくらいうれしいです。
しかし、こんなにすごいコードになるとは...
驚くばかりです。贅沢を言わせていただければ、
上書きできると助かります。このテキストファイルは
バックアップをとってあることを条件に作成してあるので...
こんなにあっという間にできるVBAってすばらしいです。
No.6
- 回答日時:
mimi923さん、こんばんは。
>上書きできると助かります。このテキストファイルは
>バックアップをとってあることを条件に作成してあるので
'Call RenamePro '名前変更プログラム
Call RenamePro '名前変更プログラム
とすれば、元のファイルを削除して、次に、名前を変更していきます。
ファイルを読んで、ファイルに書き込むのは、同じファイルでは出来ません。
そこで、臨時のファイル名を作って、そこに書き込んで、後で名前を変えるという方法を取っています。
'--------------------------------
'ユニークを出力するプログラム
Sub UniqTextPrc()
'Kill myFile '元のファイルを削除する
を、
Kill myFile '元のファイルを削除する
にします。
'Call RenamePro '名前変更プログラム
Call RenamePro '名前変更プログラム
End Sub
'--------------------------------
↓
'--------------------------------
'名前変更プログラム
Sub RenamePrc()
'--------------------------------
後で、まとめて名前を変更する場合は、
'Call RenamePro '名前変更プログラム
これは、そのままにしてください。その都度、元の名前に戻していくのなら、「'」を取ってください。
>こんなにあっという間にできるVBA
私は、4~5種類ものコードを試してみて、テキストファイルの場合、これが一番だという結論に至ったのです。実は、Dictionary は、スピードが遅いのであまり評判が良くありませんでした。今回は、他にも、WSHを使った方法や、Excelで、Dictionary を使う方法、一旦、Excelに読み込んでExcelの機能で処理する方法と、このコードの4つの中から選びました。
No.4
- 回答日時:
ご質問者からレスが着かないので、本筋(Officeカテゴリ)とは違う回答を書いておきます。
もちろん、Windows Scripting Host でもできますし、VBA(VB)ですと、もっと多彩に実行できます。それで、Cygwin などで使われている UNIX-Likeツールのsort.exe と uniq.exeを組みあせて行ってみました。以下は、拡張子が、.tarで、圧縮されていますので、それに応じた解凍ツールを用意してください。基本的な擬似Unixツール群ですから、興味のある人は、手に入れると良いと思います。
http://www.vector.co.jp/soft/win95/util/se010511 …
UNIX-like tools UNIX-like tools 4.12c
これは、あくまで、ユニークな文字列を取り出すということで解釈してください。つまり、一旦、並び替えをして、重複する行をはじく方法です。
以下に、バッチも用意しましたが、それほど必要でもないかもしれません。
拡張子(.txt)は、入れないで、実行してください。
出来上がりは、[BaseName].Txt が、[BaseName]N.Txt になります。
ファイル名は、[getuniq.bat] にします。手作業でも可能です。
これは、MS-DOS画面で、 getuniq myfile [Enter]
として実行します。
@echo off
if "%1" =="" goto errmsg
sort < %1.txt > tmp.txt
uniq < tmp.txt > %1"N.txt"
del tmp.txt
goto end
:errmsg
echo パラメータが違うか、またはありません。
:end
参考URL:http://www.vector.co.jp/soft/win95/util/se010511 …
No.3
- 回答日時:
>ほかでdictionaryを使うといいよ
>と教えていただいたのですが
他では、最後まできちんと教えてくれなかったのですか?
ただ、それは、それぞれ意見です。Dictionary を使うのは、その人の好みだと思います。
それで、Office は使うのですか?それとも、使わないのですか?
Office を使わない場合は、Dictionary のほうが楽かもしれません。
Excelの機能を使うなら、Excelにインポートして、オプションフィルターで重複を出さない・オプションで、出力したものを、拡張子<prn> で、テキスト出力すれば、できあがります。
とりあえず、MSDN のDictionary を紹介しておきます。
http://www.microsoft.com/japan/msdn/library/defa …
参考URL:http://www.microsoft.com/japan/msdn/library/defa …
この回答への補足
OFFICEを使います。エクセルにインポートして関数を使用し...という方法でやっているのですが、
たくさんのテキストファイルがあるのでなんとか簡単にできる方法がないかと思いました。
MSDN のDictionary にこだわるわけではありません。
よろしくお願いします。
ありがとうございます。このURLを読んでも
意味がわからないのです。
重複データを削除するためにMSDN のDictionary を使うと簡単なようなのですが、
No.2
- 回答日時:
重複している行を見つけて編集したい。
つまり、重複箇所を見つける方法を知りたいということでしょうか?「dictionary」というソフトのことは知りませんが、恐らく目次を作成してくれるソフトなのでしょう。その目次を見れば複数有るかどうかわかりますから。
テキストエディタにはマクロを使えるものがあります。ようするにそのテキストエディタを動かすプログラムなんですが、秀丸エディタには「重複行を削除する簡易マクロ Ver.2.07」などというものが出てますのでこれを使うのがよいのでは?
参考URL:http://hide.maruo.co.jp/index.html,http://hide.m …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/08 15:45
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/16 14:36
- Visual Basic(VBA) エクセルのマクロについて教えてください。 5 2023/07/14 12:49
- Excel(エクセル) エクセル マクロ テキストファイルを取り込む 複数の区切り文字で別々のセルに格納するには? 3 2022/08/10 21:10
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/15 16:33
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ある文字列を含む行の抽出
-
ソースコードの差分がある行番...
-
fortranでのcsvファイルを出力...
-
A列をテキストファイル名に、B...
-
c言語の問題です
-
複数行の文字列を変数として使...
-
RandomとBinaryモードの違い
-
VBAでPowerPointからExcelにデ...
-
特定フォルダ内のテキストファ...
-
VBAで新しい日付順にファイルを...
-
BCPユーティリティの使用法_...
-
VB.NETでテキストファイルからH...
-
excelにテキストファイルの指定...
-
テキストファイルの行頭に文字...
-
VB6側からテキストファイルをク...
-
コマンドプロンプトの「%1」と...
-
大量のフォルダからひとつのフ...
-
コマンドプロンプトのエラーに...
-
バッチでテキストファイルから...
-
バッチ処理でファイルの中身を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでPowerPointからExcelにデ...
-
複数行の文字列を変数として使...
-
特定フォルダ内のテキストファ...
-
VBAで新しい日付順にファイルを...
-
VB6側からテキストファイルをク...
-
テキストファイルを直接置換す...
-
RandomとBinaryモードの違い
-
Excel.VBA テキストファイルを...
-
バッチでiniファイルの編集
-
fortranでのcsvファイルを出力...
-
ある文字列を含む行の抽出
-
テキストファイルの行頭に文字...
-
access vbaでCSVファイルを文...
-
C#でのファイル編集と上書き保...
-
BCPユーティリティの使用法_...
-
unicode文字列(日本語)のファイ...
-
c言語の問題です
-
VBSを用いてIPアドレスを取得し...
-
VBAで任意のフォルダ内のファイ...
-
excelにテキストファイルの指定...
おすすめ情報