ここから本文です

MS-DOS でテキストファイル内の不要文字を削除する方法を下記で行っています。

pow********さん

2018/9/1922:58:37

MS-DOS でテキストファイル内の不要文字を削除する方法を下記で行っています。

type 元ファイル.TXT | find /v "削除したい文字列" >新ファイル.TXT

しかしながら、行数が多く時間がかかってしまっています。(上記方法で4分ほど)
尚、削除したい文字列は複数あるため、配列で順次行う手法が良いです。
これを、VBS(VBscript)で行った場合、どれほど時間短縮になりますか?

結果、今と変わらないのであれば、そのままで諦めます。
時間短縮になるのであれば、その方法を教えて貰えませんか。

エクセルにシートに取り込み、不要行を削除する事も考えました。
が、バッチ処理でエクセルが起動するのであれば全てエクセルでしてしまう方が良いと思います。
ですが、エクセルのバージョンが異なる場合、そのことも考慮する必要があるので出来るだけエクセル処理は避けたいです。

閲覧数:
115
回答数:
3
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

Prometheusさん

2018/9/2011:22:28

「VBScript」による回答です。

"00000""00001""00002""00003""00004""00005""00006""00007""00008""00009"

というデータが、100万行並んでいて、「00001」を一括削除するのに、12秒かかりました。

制限事項としては、2GBを超えるような大きなファイルには対応できません。

使用方法は、プログラムファイルに、これから処理したい「~.txt(TXTでも可)」を1つだけ、ドラッグ&ドロップするだけです。

今は、ドラッグ&ドロップしたファイルと同じフォルダ内に「Delete.txt」という結果ファイルを作成します。

後ほど、プログラムの説明をしますので、必要な部分を質問者の環境に合わせてください。

以下のプログラムを、メモ帳かテキストエディタに貼り付け、「~.vbs」という名前で保存します。

「~」の部分は、何でもかまいませんが、「.vbs」の部分は、必ず、半角です。

できたプログラムファイル(「~.vbs」ファイル)に、これから処理したい、「~.txt」ファイルを1つだけ、ドラッグ&ドロップするだけです。

最後に、ドラッグ&ドロップした時間と、終了時間を表示しますので、「OK」を押して、終了してください。

Option Explicit
Dim a, f, i, m, so, t, tx, wa
Set so = CreateObject("Scripting.FileSystemObject")
Set wa = WScript.Arguments
If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "txt" Then
MsgBox("ドラッグ&ドロップできるのは、csvファイル1つだけです")
WScript.Quit
End If
t = Time()
m = Array("00001")
f = so.GetParentFolderName(wa(0))
Set tx = so.OpenTextFile(wa(0), 1)
a = tx.ReadAll
tx.Close
Set tx = Nothing
For i = 0 to UBound(m)
a = Replace(a, m(i), "")
Next
Set tx = so.OpenTextFile(f & "\Delete.txt", 2, True)
tx.Write a
tx.Close
Set tx = Nothing
Set wa = Nothing
Set so = Nothing
MsgBox(t & vbCrLf & Time())

簡単な説明です。

Option Explicit

「厳密に」というような意味ですが、気にしないでください。

Set so = CreateObject("Scripting.FileSystemObject")

ファイルやフォルダを扱えるようにしていますが、今回は特に、テキストファイルを扱うのにも必要です。

Set wa = WScript.Arguments
If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "txt" Then
MsgBox("ドラッグ&ドロップできるのは、csvファイル1つだけです")
WScript.Quit
End If

ドラッグ&ドロップされるのを待っていて、ドラッグ&ドロップされると、その数や拡張子を調べ、想定外なら、メッセージを表示して、プログラムそのものを終了してしまいます。

t = Time()

現在の時間を覚えています。

m = Array("00001")

削除文字列です。

複数ある場合は、

m = Array("00001", "00002", "00003")

というように、いくつでも追加できます(ここを変更しても、以後のプログラムを変更する必要はありません)。

f = so.GetParentFolderName(wa(0))

ドラッグ&ドロップしたファイルが存在するフォルダを調べています。

Set tx = so.OpenTextFile(wa(0), 1)

ドラッグ&ドロップしたファイルを「読み込み専用」で開いています。

a = tx.ReadAll

一気に全部読み込んでいます。

tx.Close
Set tx = Nothing

閉じています。

For i = 0 to UBound(m)
a = Replace(a, m(i), "")
Next

「m = Array()」で指定した文字列を順番に一括置換で削除しています。

Set tx = so.OpenTextFile(f & "\Delete.txt", 2, True)

ドラッグ&ドロップしたファイルと同じフォルダ内に「Delete.txt」というファイルを「書き込み専用」で新規作成しています。

tx.Write a

置換した結果データを書き込んでいます。

tx.Close
Set tx = Nothing

閉じています。

Set wa = Nothing
Set so = Nothing
MsgBox(t & vbCrLf & Time())

あとは、終了処理で、最後に「開始時間と終了時間」を表示しています。

  • 質問者

    pow********さん

    2018/9/2015:28:14

    回答、プログラム、ありがとうございます。

    使用したいのですが、「ドラッグ&ドロップ」ではなく、
    ・ファイル名称を固定(ファイル名は"FILE_INDEX.TXT")
    ・VBSファイルと同じフォルダ内にある
    という条件を付け忘れていました。

    条件の後出しをして申し訳ありません。

    その他の処理状況は全く問題の無いプログラムです。

    以上、後出し条件ですが、どのように修正をすれば良いのか解らないので、修正のほどよろしくお願いします。

    尚、経過時間は1秒未満でしたm(__)m

  • その他の返信(3件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2018/9/21 13:51:09

短時間で解決できたので助かりました。
昔は、「本で調べる」でしたが、今は「ネットで質問」、便利な世の中ですね。
これで、自分の知識が増えるのかが心配ですが、頑張ります。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

ste********さん

2018/9/2000:41:52

バッチが遅いのは1行づつの処理で、かつ都度ファイルアクセスを行うからです。
VBSやPowershellでファイルの内容を一旦すべてメモリに読み込み、メモリ上で編集してから一括で書き出せば圧倒的に早くなりますよ

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

たてばとさん

2018/9/2000:05:43

シェアウエアですが秀丸エディタは非常に速いです。
処理の途中経過を表示しないに設定して実行すると相当大きなファイルでもとてつもない速度で終了します。
その場限りの作業ならお試しでできますので試して見られたらどうでしょうか?

フリーだとサクラエディタが有名ですがそちらではどれぐらいの速度で処理できる
のかわからないのですがフリーなのでこちらも試して見られたら良いと思います。
秀丸もサクラも正規表現によるパターンマッチも使えたはずです。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる