許せない心理テスト

テキストファイルには
A1234
B3456
A1234
CF456789
というデータがあります。
これを
B3456
A1234
CF456789
このようにして上書きしたいのですが
ほかでdictionaryを使うといいよ
と教えていただいたのですが
どのようにしてよいのかわからず
誰か教えていただけないでしょうか?
よろしくお願いします。

A 回答 (6件)

>重複データを削除するために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
    • good
    • 0
この回答へのお礼

信じられないくらいうれしいです。
しかし、こんなにすごいコードになるとは...
驚くばかりです。贅沢を言わせていただければ、
上書きできると助かります。このテキストファイルは
バックアップをとってあることを条件に作成してあるので...
こんなにあっという間にできるVBAってすばらしいです。

お礼日時:2005/04/25 18:52

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つの中から選びました。
    • good
    • 0
この回答へのお礼

たいへん失礼しました。
そんなに何種類もの方法があるのですか...
ありがとうございました。

お礼日時:2005/04/25 22:46

ご質問者からレスが着かないので、本筋(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 …
    • good
    • 0
この回答へのお礼

ありがとうございます。お返事がおそくなりすいません。並べ替えはせずに重複データを削除したいのです。

お礼日時:2005/04/24 17:42

>ほかで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 にこだわるわけではありません。
よろしくお願いします。

補足日時:2005/04/24 19:03
    • good
    • 0
この回答へのお礼

ありがとうございます。このURLを読んでも
意味がわからないのです。
重複データを削除するためにMSDN のDictionary を使うと簡単なようなのですが、

お礼日時:2005/04/24 17:23

重複している行を見つけて編集したい。

つまり、重複箇所を見つける方法を知りたいということでしょうか?
「dictionary」というソフトのことは知りませんが、恐らく目次を作成してくれるソフトなのでしょう。その目次を見れば複数有るかどうかわかりますから。

テキストエディタにはマクロを使えるものがあります。ようするにそのテキストエディタを動かすプログラムなんですが、秀丸エディタには「重複行を削除する簡易マクロ Ver.2.07」などというものが出てますのでこれを使うのがよいのでは?

参考URL:http://hide.maruo.co.jp/index.html,http://hide.m …
    • good
    • 0
この回答へのお礼

重複行を削除したいです。シェアウエアですね。
いろんなものがあるものです。
参考になりました。

お礼日時:2005/04/24 19:21

テキストファイルのファイルサイズが大きくないなら、単純にNotepadで最初の行を削除し、上書き保存することでできますが、、、

    • good
    • 0
この回答へのお礼

重複データは最初の行にあるわけではなく、どこかにあるかもしれないので、それを見つけて削除したいのです。

お礼日時:2005/04/24 17:25

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


おすすめ情報