テキストファイルを直接置換する方法

このQ&Aのポイント
  • VBAを使用してテキストファイルを直接置換する方法について教えてください。
  • 複数のテキストファイルを読み込んで指定した文字列を別の文字列に検索・置換するプログラムを作成したいです。
  • 配列に読み込まずに既存のファイルを直接編集する方法を教えてください。
回答を見る
  • ベストアンサー

テキストファイルを直接置換する方法

VBAに関する質問です。 複数のテキストファイルを読み込んで 指定した文字列を別の文字列に検索・置換してくれるプログラムを作りたいと考えています。 これをするためには一度 Set MyTxt = FSO.OpenTextFile(StrPath, 1) Do While MyTxt.AtEndOfStream = False hairetu(xxx) = MyTxt.ReadLine loop のようにしてテキストデータを全て配列に読み込み、 Replace関数で一つずつ検索・置換した後に Open StrPath For Output As #1 Print #1, hairetu(xxx) のようにしてファイルを出力し直すしかないですか? 配列に読み込まずに 既存のファイルを直接編集する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.8

1行でも同じです。 「1行」というのは、「改行文字」という特殊な文字を区切りに使っているもので、コンピュータにとっては、他の文字と違いはありません。 「行で探す」というのは「改行文字の数で探す」ことになります。 文字列で探すのと、ほとんど同じことです。 バイト数が置換の前後で同じなら、方法は無いわけではありません (MODE BINARY ACCESS READ WRITE でOPEN→SEEKで書き換える位置へ移動) ですが、プログラムの難易度を考えると、現在の方法より優れている、とは言えません。 もし、Excelでやらなければならない理由が無いのなら、他の方法を使うのが楽です。 例えば、テキストエディタの「grep置換」等と呼ばれる機能を使うとか。 UNIX系OSでは標準の sed コマンドのWindows版を使うとか。

warewared
質問者

お礼

ありがとうございます。 結局のところ、VBAでやるなら全てのテキストデータを一度配列に読み込ませた後に、 replace関数で全ての文字列を置換後に再度テキストデータとして 出力するしかないということでしょうか? grepのソフトウェアはあるのですが これらのソフトも同じように一度配列に書き出す方法をとっているのでしょうか?  

warewared
質問者

補足

これであっていますか? もっと良い方法があれば教えてください。 Sub test78() Dim FSO As Object, buf As String Set FSO = CreateObject("Scripting.FileSystemObject") ''C:\Work\Sample.txtの全ての文字を読み込んで表示します With FSO.GetFile("d:\新しいテキスト ドキュメント.txt").OpenAsTextStream buf = .ReadAll buf = Replace(buf, "コリアン", "ジャパニーズ") .Close End With Set FSO = Nothing StrPath = "D:\test.txt" Open StrPath For Output As #1 Print #1, buf Close #1 End Sub

その他の回答 (8)

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.9

>結局のところ、VBAでやるなら全てのテキストデータを一度配列に読み込ませた後に、 >replace関数で全ての文字列を置換後に再度テキストデータとして >出力するしかないということでしょうか? VBAに限らず置換前と置換後のバイト数が異なるなら一度読み込んで出力し直すしかありません。

warewared
質問者

お礼

ありがとうございます。  

回答No.7

【補足】3行目の"ABC"を"123"に書き換えよ。 >別ファイルに出力する手段は取ってはいけない。 >ただし、1行目、2行目と順次に3行目まで読み込むのは構わない。 【答】FileSystemObjectでは不可能。 1、X行目を取得する関数を作成する。 2、X行目を直接に書き換える関数を作成する。 これなら可能です。

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.6

> 例えば、 > > ABC > DEF > GHI > というテキストファイルがあり > > DEFだけをJKLに書き換えるにはどうしたら良いですか? Excelにこだわらず、Wordでやってみるのも一案かと思います。 以下は、Wordのマクロの自動記録です。 手順は 1.変換元のファイル(test.txt)を開く 2.置換で「DEF→JKL」(全置換) 3.別名で(test_p.txt)テキスト形式で保存 …以下だけは変更してあります。 [元ファイルのあるフォルダ名] 自動保存ですが、ここまで可能です。 後は、 ・オプション変換オプション ・複数ファイルのループ設定 ・変換後のファイルの保存先、ファイル名 などを調整してください Sub Macro1() ' ' Macro1 Macro ' ' ChangeFileOpenDirectory "[元ファイルのあるフォルダ名]" Documents.Open FileName:="test.txt", ConfirmConversions:=False, ReadOnly:= _ False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _ "", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _ Format:=wdOpenFormatAuto, XMLTransform:="", Encoding:=932 Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "DEF" .Replacement.Text = "JKL" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = False End With Selection.Find.Execute Replace:=wdReplaceAll ActiveDocument.SaveAs FileName:="test_p.txt", FileFormat:=wdFormatText, _ LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword _ :="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _ SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _ False, Encoding:=932, InsertLineBreaks:=False, AllowSubstitutions:=False, _ LineEnding:=wdCRLF End Sub

回答No.5

Q、検索して書き換える方はどうすれば良いでしょうか? A、一行づつ読んだら一行づつ書き込みます。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

一般的には「直接編集する」方法は無いと思ってください。 ファイルは、原稿用紙をイメージしてください。 できることは ・マスに1文字書き込む。既に書いてあるマスだったら、消しゴムで消してから書き込む ・書いてある文字を1マスずつ読む ・全体の長さを決める だけです。 「1行読む」は「1マス読む、を改行まで繰り返す」ことです。 ABCDE のBC をb に置き換えたいとします。 ただ2マス目をbに書き換えただけだと AbCDE となり、Cが残ります。「取り除く」ことはできません。 そこで  3マス目に次の文字(D)を読み込んで書く  4マス目に次の文字(E)を読み込んで書く  長さを4に決める とやる必要があります。これで AbDE になります。 挿入時も同様に 長さを延す→後へずらす→空いたマスに書き込む という操作が必要です。 これを楽にやる方法の一つが、「操作が楽なものにコピーを作って、出来上がったら元に戻す」というものです。 その実例の一つが「操作が楽な文字列の配列にコピーを作って、出来上がったものを元のファイルに書き出す」という今のやりかたです。

warewared
質問者

お礼

ファイルまるごと直接編集は無理だとして 一行ごとに直接編集は可能ですか? 例えば、 ABC DEF GHI というテキストファイルがあり DEFだけをJKLに書き換えるにはどうしたら良いですか?

  • freetaka
  • ベストアンサー率53% (106/197)
回答No.3

VBAというからにはエクセルあたりを使うわけですよね? であれば配列とあわせて読み込んだ行をセルに表示して 目に見えるような状態にするというのも1つの方法です シートをわけることでBefore・Afterのような プレビューも実装することができますし 保存するコードを書く時も簡単に ActiveWorkbook.SaveAs Filename:="ファイル名", FileFormat:=xlText みたいにできます 以上参考までに・・・

回答No.2

「DOSコマンドを利用する」という手は除外するとして・・・。ファイルを一行づつ読み込むって手はあります。次は、私が1998年頃にマイサイトにアップした FileRead関数です。 207: FileRead関数: ファイルの各行を順次に読み込みます。 Public Function FileRaed(ByVal FileName As String) As String On Error GoTo Err_FileRead   Static isOpen AS Boolean   Static fso  As FileSystemObject   Static fil  AS File   Static txs  As TextStream      If Not isOpen Then     isOpen = True     Set fso = New FileSystemObject     Set fil = fso.GetFile(FileName)     Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)   End If   FileRead = IIf(fil.Name = FileName, txs.ReadLine, "") Exit_FileRead:   If Len(FileRaed) = 0 Then     isOpen = False     Set txs = Nothing     Set fil = Nothing     Set fso = Nothing   End If   Exit Function Err_FileRead:   MsgBox Err.Description & "(FileRead)", vbExclamation, " 関数エラーメッセージ"   Resume Exit_FileRead End Function ? FileWrite("Test.txt", "1: A" & Chr$(13) & Chr$(10) & "2: B" & Chr$(13) & Chr$(10)) True ? FileRead("Test.txt") 1: A ? FileRead("Test.txt") 2: B ? FileRead("Test.txt")  FileRead関数を使っての順次読み込みを中止する場合には FileRead("") とファイル名にヌル値をセットします。

warewared
質問者

お礼

読み込む方は分かったのですが 検索して書き換える方はどうすれば良いでしょうか?  

回答No.1

関連するQ&A

  • テキストファイル中の文字列を書き換えるスクリプトを書きたい

    テキストファイルの文字列を書き換えるスクリプトを考えています。 今、次のところまで出来るようになりました。本当は「こんにちは」の文字列を全て「HELLO」に置換したいのです。現在は一行の中で最初の「こんにちは」は置換されますが、2番目以降が置換されません。同じ行中の2番目以降も置換するには、どうしたら良いでしょうか? <置換前ファイル:sample.txtの中身> こんにちはこんにちはこんにちはこんにちは こんにちは こんにちは <置換前ファイル:sample.txtの中身> HELLOこんにちはこんにちはこんにちは HELLO HELLO <置換スクリプト> Set fso = CreateObject("Scripting.FileSystemObject") Set regEx = New RegExp Set inFile = fso.OpenTextFile("C:\static\sample.txt") Set outFile = fso.CreateTextFile("C:\static\sample1.txt") regEx.Pattern = "こんにちは" repStr = "HELLO" Do Until inFile.AtEndOfStream tempLine = inFile.ReadLine repLine = regEx.Replace(tempLine, repStr) outFile.WriteLine repLine Loop inFile.Close outFile.Close

  • ファイル内の文字列を置換するcscriptについて

    お世話になります。 早速ですが、 以前、以下のような、「UNIXファイルの文字列を置換する」プログラムを Cscript で記述する方法を教えていただいたものですが、 cscript //nologo foo.vbs < t22.org > t22.txt ====foo.vbs==================================================== Do While Not WScript.StdIn.AtEndOfStream str = WScript.StdIn.ReadLine WScript.StdOut.Write replace(str,"abc","xxx") & vbLF Loop 今回、これをさらに、 Cscript で「置換するファイル」と「置換する文字列」も指定するプログラム にしたいと思い記述してみたのですが、下記のような問題が発生します。 「置換後のファイルの最後に改行文字が入ってしまいます。」原因がわかりません。 cscript //nologo f00.vbs t22.txt aaa xxx ====foo.vbs==================================================== Dim myFile Dim myRec Dim fso Dim txt, wd1, wd2 txt = WScript.Arguments(0) wd1 = WScript.Arguments(1) wd2 = WScript.Arguments(2) WScript.Echo txt WScript.Echo wd1 WScript.Echo wd2 Set fso = CreateObject("Scripting.FileSystemObject") Set myFile = fso.OpenTextFile(txt) myRec = myFile.ReadAll myRec = replace(myRec,wd1,wd2) myFile.Close Set myFile = fso.CreateTextFile(txt) myFile.WriteLine (myRec) myFile.Close =============================== このコードのどこに問題があるのでしょうか? 読み込んでいるファイルは、Shift-JIS LF改行のファイルです。 あるいは、 もっと簡単な記述方法等ありましたら、ご意見、ご指導ください。

  • 「?」の入った文字列置換を、RegEx.Replaceで行いたい

    WSHを使い、あるhtmファイルの中にある特定の文字列を、RegEx.Replaceを使って置換しようとしています。通常の文字列置換についてはなんとか成功しているのですが、下記のケースで壁に当たっています。前に進める為にはどうしたらよいか、ヒントをご存知の方がいれば大変有り難く思います。 今回作業の特徴としては 1)置換前の文字列の中にメタキャラ「?」が含まれており、 2)置換前の文字列は、DBから読み込んできた文字列である の2点です。(ちなみに1だけでは成功しているのですが、1と2が組み合わさると上手くいきません) 具体的には、下記のサンプルで置換前の文字列を url_before = "test.asp\?param=999" (?についてはエスケープ文字付与) のように明示的に書いてやると置換に成功しました。ところがDBから取得してきた文字列で置換をしようとしても失敗となります。 たとえばrs.fields("item")の中身が"test.asp?param=999"だったとして、先ほどの箇所を url_before = replace(rs.fields("item"), "?", "\?") とすると、置換されないのです。 '----- サンプル ----- Set fso = CreateObject("Scripting.FileSystemObject") Set regEx = New RegExp Set inFile = fso.OpenTextFile("c:\hoge\test1.htm") Set outFile = fso.CreateTextFile("c:\hoge\test1_wk.htm") ◆動くケース:url_before = "test.asp\?param=999" ◆動かないケース:url_before = replace(rs.fields("item"), "?", "\?") url_after = "test_999.htm" regEx.pattern = url_before repStr = url_after Do Until inFile.AtEndOfStream tempLine = inFile.ReadLine repLine = regEx.Replace(tempLine, repStr) outFile.WriteLine repLine Loop inFile.Close outFile.Close

  • テキストファイルの中身を自動で置換したい

    VBA初心者なので説明不足な部分があると思いますがよろしくお願い致します 現在テキストファイルを開いてCtrl+Hで検索する文字列を検索 置換後の文字列を入力し置換しているのですが ファイル数が多く1つ1つ開いて置換するのがとても面倒です Excelで開けば良いのでは?と前にご意見をいただいたのですが Excelで開いてそこからの操作がよくわからず…。 できればボタン一つで自動的に置き換えられるようにしたいのですが どのようにコードを書けば良いのかまったくわかりません。 ・指定フォルダー内にある(1つまたは複数の)テキストファイル内の文字列をすべてセルに書き出す ・セルから特定の文字(例→【 ,F1 】)を検索し、特定の文字(例→【 ,A2 】)に置換する ・上書きして保存 という感じにしたいのですができますでしょうか? 無理そうでしたら大丈夫です 閲覧いただきありがとうございました

  • テキスト置換なのですが

    テキストドキュメントの中の文字列をあいまいに検索して置換できるソフトなどはないのでしょうか? 例えば検索条件を aaabbb****ccc として(*はすべての文字列)として、検索し、それを aaabbbxxxxccc など置換するといったことがしたいのです。 かなり調べてみましたが、分かりませんでした。(もしかするとものすごく初歩が分かっていないのかもです)よろしくお願いします。

  • UTF-8のTextファイルの置換

    UTF-8で記述されたファイルをVBにて置換しようとしております。 置換する文字は、Tab→空白4個と"><"の間に改行を入れる置換を しようとしております。 AtEndOfStreamで読み込んで置換するのではないかと思うのですが それ以上が分かりません。 ご教授いただけないでしょうか?

  • 複数のテキストファイルの一括置換について

    複数のテキストファイルの一括置換について 複数のテキストファイル(html)の中にある 【地域名】という文字列を一括でそれぞれA、B、C・・・・という風に異なる文字列に変換したいです。 たとえば 001/index.html の中にある【地域名】は北海道 に変換 002/index.html の中にある【地域名】は青森 に変換 ・ ・ ・ 変換前の文字列は同一ですが、変換後の文字列を全ファイル異なるものにしたいので秀丸等の一括置換ができずに困っています。 全ファイル開いて1つ1つ検索置換していくには2000ファイルほどあるので大変なので何かいい案はないでしょうか? よろしくお願いいたします。

  • テキストファイルの置換

    同じテキストファイルの中に abcdefg,21 abcdefg,414 abcdefg,5 という文字列があった場合、 一括置換で abcdefg,0 abcdefg,0 abcdefg,0 という風にできるテキストエディタを探しています。 ご存知の方はいらっしゃいますか???

  • テキスト置換ツールについて

    あらかじめExcelで作成した置換表(置換前文字列、置換後文字列の一覧)に基づいて、指定したファイル群のテキストを一括置換してくれるようなツールはないでしょうか。

  • ファイルの変換で文字化けを回避したい

    ファイル中の文字列を一部書き換える処理をしています。regEx.replaceを使って書き換えたところ、日本語が下記のように文字化けしてしまいます。 これを回避するためにどうしたら良いでしょうか? ○変換前:test1.txt <description>東京都</description> ○変換結果:test2.txt(文字化け) <description>譚ア莠ャ驛ス</description> ○スクリプト Set fso = CreateObject("Scripting.FileSystemObject") Set inFile = fso.OpenTextFile("c:\test1.txt") Set outFile = fso.CreateTextFile("c:\test2.txt") Set regEx = New RegExp regEx.pattern = "テスト" repStr = "てすと" Do Until inFile.AtEndOfStream tempLine = inFile.ReadLine repLine = regEx.Replace(tempLine, repStr) outFile.WriteLine repLine Loop inFile.Close outFile.Close

専門家に質問してみよう