大量のテキストファイルの「ある文字列」1箇所を置換をかけたいのですが、

オーバーフローしてしまい困っています。お力頂ければ幸いです。

テキストファイルは1ファイルにつき3KB程度です。
ですが、そのようなファイルが約40万個あります。
(ですので総容量は3KB×40万個=1.2GBもあります)
全てあるフォルダ内にあります。

全てのテキストファイルに共通して、ある文字列があり、
それを置換(正確には削除)をかけたいと思っています。

テキストファイルのある文字列を置換するには、
【1】フリーソフトを使う
【2】コマンドプロンプトを使う
【3】ExcelのVBAを使う
などいろいろなやり方があると思いますが、【1】はいくつかのものを
使ってみましたが、数百ファイル程度でオーバーフローしてしまいだめでした。

全文はこちら(500文字におさまらず)
http://pub.idisk-just.com/fview/qTXX5emK7xt1jJFhX0tr7xTDNHG0PK0wlI9CJ5y6ZvlxsL4pN07lrBi1dvq9ZggZ/6LOq5ZWP.txt

回答の条件
  • 1人1回まで
  • 登録:2009/10/10 12:09:37
  • 終了:2009/10/10 20:38:59

ベストアンサー

id:HALSPECIAL No.2

HALSPECIAL回答回数407ベストアンサー獲得回数862009/10/10 14:05:14

ポイント78pt

WSH(VBScript)です。

こちらでいけないでしょうか?

メモ帳などのエディタに貼り付けて、※の部分を書き替え

ファイルの置換.vbs

のようなファイル名で保存します。(拡張子をvbsにする事)

ダブルクリックすると実行されます。


Option Explicit

Const TARGET_FOLDER = "D:\TEMP"     '※フォルダを指定
Const REPLACE_FROM = "置換前文字列" '※
Const REPLACE_TO   = "置換後文字列" '※

Const ForReading = 1 '読み込み
Const ForWriting = 2 '書きこみ(上書きモード)
Const ForAppending = 8 '書きこみ(追記モード)

Dim objFSO, objFolder, objFile, objSubFolder, objTXT
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(TARGET_FOLDER)

For Each objFile In objFolder.Files
    Dim strFilePath, infile, outfile, strData
    strFilePath = objFSO.BuildPath(TARGET_FOLDER, objFile.Name)
    Set infile = objFSO.OpenTextFile(strFilePath,ForReading)
    strData = infile.ReadAll
    infile.Close
    Set infile = Nothing
    Set outfile = objFSO.OpenTextFile(strFilePath,ForWriting)   '(上書き)
    outfile.Write Replace(strData,REPLACE_FROM,REPLACE_TO)
    outfile.Close
    Set outfile = Nothing
Next

Set objFolder = Nothing
Set objFSO = Nothing

MsgBox "終了", vbInformation

※ファイルの内容を書き換えるものですので、実行前に、あらかじめバックアップ等しておいてください。

id:miku1973

完璧にできました!約4時間で完了できました!

2009/10/10 20:38:20

その他の回答(2件)

id:naka1kazu No.1

naka1kazu回答回数236ベストアンサー獲得回数122009/10/10 13:35:13

ポイント1pt

私ならSEDもしくはGAWKを使用しますね。

http://www.nurs.or.jp/~sugi/sed.htm

http://www.lingua.tsukuba.ac.jp/~sugi/jgawk.html

FreeでGNUコマンドとして入手できるはずです。Windowsであれば

http://www.cygwin.com/

でまとめてUnix環境を導入してもOKです。

id:HALSPECIAL No.2

HALSPECIAL回答回数407ベストアンサー獲得回数862009/10/10 14:05:14ここでベストアンサー

ポイント78pt

WSH(VBScript)です。

こちらでいけないでしょうか?

メモ帳などのエディタに貼り付けて、※の部分を書き替え

ファイルの置換.vbs

のようなファイル名で保存します。(拡張子をvbsにする事)

ダブルクリックすると実行されます。


Option Explicit

Const TARGET_FOLDER = "D:\TEMP"     '※フォルダを指定
Const REPLACE_FROM = "置換前文字列" '※
Const REPLACE_TO   = "置換後文字列" '※

Const ForReading = 1 '読み込み
Const ForWriting = 2 '書きこみ(上書きモード)
Const ForAppending = 8 '書きこみ(追記モード)

Dim objFSO, objFolder, objFile, objSubFolder, objTXT
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(TARGET_FOLDER)

For Each objFile In objFolder.Files
    Dim strFilePath, infile, outfile, strData
    strFilePath = objFSO.BuildPath(TARGET_FOLDER, objFile.Name)
    Set infile = objFSO.OpenTextFile(strFilePath,ForReading)
    strData = infile.ReadAll
    infile.Close
    Set infile = Nothing
    Set outfile = objFSO.OpenTextFile(strFilePath,ForWriting)   '(上書き)
    outfile.Write Replace(strData,REPLACE_FROM,REPLACE_TO)
    outfile.Close
    Set outfile = Nothing
Next

Set objFolder = Nothing
Set objFSO = Nothing

MsgBox "終了", vbInformation

※ファイルの内容を書き換えるものですので、実行前に、あらかじめバックアップ等しておいてください。

id:miku1973

完璧にできました!約4時間で完了できました!

2009/10/10 20:38:20
id:tamo2_xvi No.3

tamo2_xvi回答回数436ベストアンサー獲得回数102009/10/10 15:25:51

ポイント1pt

http://hide.maruo.co.jp/software/hidemaru.html

秀丸エディッタのgrep機能で簡単に置換出来ると思います。

置換には正規表現もできますし、マクロを組む事も出来るので

おおよその事は可能だと思います。

シェアですが試用も出来ますので、お試しください。

  • id:standard_one
    cygwinは導入されてますか?
  • id:miku1973
    残念ながら未導入です。
    インストールできればしてみたいです。
  • id:qnighy

    http://gnuwin32.sourceforge.net/packages.html

    上記のGnuWin32を使えば、Cygwinなしで、個別にコマンドをインストールできます。

    sedは以下のページからダウンロードできます。

    http://sourceforge.net/projects/gnuwin32/files/sed/4.2-1/sed-4.2-1-setup.exe/download

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません