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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
時間短縮のために、テキストフ...
-
CSVファイルの中身を操作し...
-
VBAでPowerPointからExcelにデ...
-
アンケート結果をcsv出力できる...
-
大量のフォルダからひとつのフ...
-
コマンドプロンプトのエラーに...
-
コマンドプロンプトの「%1」と...
-
binファイルを解凍したいの...
-
iPhoneでXMLファイルを開くには...
-
VBAでワークシートを引数として...
-
名前の変更ができない動画ファイル
-
バッチでテキストファイルから...
-
これってパソコンの最適化が完...
-
エクセルのVBAについて とある...
-
一定のファイル数ごとにフォル...
-
コマンドプロンプトで変数が数...
-
jarファイル
-
コマンドプロンプト標準出力と...
-
テキスト(txt)→ワード(docx)へ...
-
パソコンのフォルダー内のファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
時間短縮のために、テキストフ...
-
複数行の文字列を変数として使...
-
特定フォルダ内のテキストファ...
-
fortranでのcsvファイルを出力...
-
VBAで新しい日付順にファイルを...
-
Excel.VBA テキストファイルを...
-
VB6側からテキストファイルをク...
-
VBAでPowerPointからExcelにデ...
-
テキストファイルの行頭に文字...
-
BCPユーティリティの使用法_...
-
バッチでiniファイルの編集
-
unicode文字列(日本語)のファイ...
-
テキストファイルを直接置換す...
-
ある文字列を含む行の抽出
-
RandomとBinaryモードの違い
-
access vbaでCSVファイルを文...
-
VB.NETでテキストファイルからH...
-
iniファイルとの比較(iniファイ...
-
ソースコードの差分がある行番...
-
VBSを用いてIPアドレスを取得し...
おすすめ情報