• ベストアンサー

置換?について

いつもお世話になっております。sako77です。 今回は置換?について質問させていただきます。 ファイルA(テキストファイル)に以下のような文章があります。 例) おはようございます。今日も●●●です。こんにちは。今日も◆◆◆◆です。おやすみ今日も■■です。・・・ 上記のようなテキスト文章から「今日も」から「です」の間の文字列を抽出し、別テキストファイルBに ●●●● ◆◆◆◆ ■■ のように出力したいのですが、こんなことはできるのでしょうか? エクセルかアクセス又はこんなことができるソフトがあれば教えてください。 よろしくお願い致します。

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

A No.1です。 subMatchが何個まで対応できるか気になったので、長いテキストで試験してみましたが、その際、このケースではsubMatchは常に1個だけである事に気付きました。今回、沢山できるのはMatchの方で、500個位あっても動作しました。下記は、テキストファイルを読む、修正版です。 Sub test2() Dim regEX As Variant Dim Matches As Variant Dim match As Variant Dim matchString As String Dim targetString As String Dim subMatch As Object targetString = readTextFile("C:\Documents and Settings\??????\My Documents\hoge.txt") matchString = "今日も([^。]*)です。" Set regEX = CreateObject("VBScript.RegExp") regEX.MultiLine = True regEX.Pattern = matchString regEX.ignorecase = True regEX.Global = True Set Matches = regEX.Execute(targetString) For Each match In Matches If match.submatches.Count > 0 Then Debug.Print match.submatches.Item(0) End If Next match Set Matches = Nothing Set regEX = Nothing End Sub Private Function readTextFile(fileName As String) As String Dim FSO As Object Dim buf As String Set FSO = CreateObject("Scripting.FileSystemObject") With FSO.getfile(fileName).OpenAsTextStream buf = .ReadAll readTextFile = buf .Close End With Set FSO = Nothing End Function

sako77
質問者

お礼

いろいろと検証して頂きありがとうございます。 是非参考にさせてもらいます。

その他の回答 (4)

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.5

一応、関数案です。 A1に おはようございます。今日も●●●です。こんにちは。今日も◆◆◆◆です。おやすみ今日も■■です。・・・ として A2に =MID(A1,FIND("今日も",A1)+3,255) 下フィル B2に =LEFT(A2,FIND("です",A2)-1)    下フィル では? 但し、文字数 255文字まで

sako77
質問者

お礼

回答ありがとうございます。 文字数は長いものも多々あるので上限がちょっとわからないですね。 けど、こういう方法もあるんだと勉強になりました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 すでに回答は出ていますが、こんな風な感じにしてみたらいかがでしょうか。なお、Excel2000などの下位バージョンでは、この方法は、処理行が大量の場合は、うまく行かないことがあります。 実際、 >エクセルかアクセス又はこんなことができるソフトがあれば教えてください。 テキスト -> テキストで、あえて、ExcelなどのVBAを使う必要性はないようには思います。 VBScript でも可能です。 なお、「今日もxxxx axxaxです。」の xxxx axxax は、抜き出せても、 「今日もxxxx axxaxです」は、抜き出せないようなパターンになっています。出力側が予め決められていて、アペンドモードになっています。入力側は、このマクロではダイアログ選択になっています。 -------------------------------------- Sub RegExpTest()   Dim Matches As Object 'MatchCollection   Dim Match As Object 'Match   Dim FileName As String   Dim TextLine As String   Dim buf As String   Dim inFno As Integer   Dim outFno As Integer   Dim outFname As String      '出力用ファイル名(要設定--質問中のテキストファイルB)   outFname = Application.DefaultFilePath & "\" & "OutTest.Txt"   If Dir(outFname) = "" Then     MsgBox outFname & vbCrLf & "出力ファイルがありません。", 48     Exit Sub   End If      '検索用ファイル(質問中のテキストファイルA)   FileName = Application.Application.GetOpenFilename _   ("テキストファイル(*.txt),*.txt")   If FileName = "False" Then Exit Sub   If StrComp(FileName, outFname, 1) = 0 Then     MsgBox "出力ファイルは選べません。", 48     Exit Sub   End If   With CreateObject("VBScript.RegExp")     .Pattern = "今日も([^(です)]+)です。"          .Global = True     inFno = FreeFile()     Open FileName For Input As #inFno          Do While Not EOF(inFno)       Line Input #inFno, TextLine       If .Test(TextLine) Then         Set Matches = .Execute(TextLine)         For Each Match In Matches           buf = buf & vbCrLf & .Replace(Match, "$1")         Next       End If     Loop       Close #inFno       buf = Mid$(buf, 3)       outFno = FreeFile()       If Len(buf) > 1 Then         Open outFname For Append As #outFno         Print #outFno, buf         Close #outFno         Beep       End If     End With End Sub

sako77
質問者

お礼

回答ありがとうございます。 必要な部分が抜き出せるだけで十分ですので大変ありがたいです。 本当にありがとうございました。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

正規表現の練習問題みたいな感じですね。 テキスト編集で、丁度、同じような例題が以下にありましたので、参考にしてください。 (もちろん、エクセルやアクセスのVBAでも可能です。) http://ukiya.sakura.ne.jp/index.php?%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E8%AC%9B%E5%BA%A7%2F1

sako77
質問者

お礼

ありがとうございました。 参考にさせてもらいます。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

エクセルVBAの事例です。(アクセスでも動くと思います) 正規表現を使っています。もっとスマートなマッチングの仕方がありそうに思いますが、とりあえず出来たという事で回答とします。 テキストファイルへの出力はご自分でなさって下さい。FileSystemObjectを用いる事例を参考urlに記しました。 Sub test() Dim regEX As Variant Dim Matches As Variant Dim match As Variant Dim matchString As String Dim targetString As String Dim subMatch As Object Dim i As Long targetString = "おはようございます。今日も●●●です。こんにちは。今日も◆◆◆◆です。おやすみ今日も■■です。・・・" matchString = "今日も([^。]*)です。" Set regEX = CreateObject("VBScript.RegExp") regEX.MultiLine = True regEX.Pattern = matchString regEX.ignorecase = True regEX.Global = True Set Matches = regEX.Execute(targetString) i = 1 For Each match In Matches If match.submatches.Count > 0 Then For i = 0 To match.submatches.Count - 1 Debug.Print match.submatches.Item(i) Next i End If Next match Set Matches = Nothing Set regEX = Nothing End Sub 詳細は VBA 正規表現 で検索してください。

参考URL:
http://officetanaka.net/excel/vba/filesystemobject/textstream.htm

関連するQ&A

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

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

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

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

  • テキストエディタでの置換(正規表現チェック済)と同様のことを

    テキストエディタでの置換(正規表現チェック済)と同様のことを エクセルのマクロでもしたい。 画像を添付しましたが、秀丸で置換を選択し、 検索文字列と置換文字列を入れて、正規表現チェックのチェックボックスを 選択した状態で実行するのと同様のことをエクセルのマクロで行いたいです。 正規表現混みだととても難しいです。 やりたいことはマクロで、フォルダ内のテキストファイルを置換をかけていきたいです。(テキストファイルは複数ある状態)そのテキストファイルを更新できればいいです。(別テキストで出力されてもいいです。) どなたか詳しい方、教えていただけませんでしょうか? よろしくお願いいたします。 --- 検索エディタ【秀丸】【置換】 検索【.*item1=(.*) item2=(.*) .*】 置換【\1\t\2】 正規表現チェック

  • エクセル 置換後の文字列について

    エクセル2003です 置換後の文字列について質問させてください 特定のセルに文字を入力し 例 C100に(9月)等 検索と置換にて 置換後の文字列を C100のテキストに 置換したいのですが 入力時にC100を選択する方法がわかりません  よろしくお願い致します

  • エクセル置換・検索

    エクセル(バージョン2000)で オブジェクト(オートシェイプ)内の テキスト文章(文字列)を 検索及び置換したいのですが、方法があれば ご教示いただけますでしょうか? すみません、宜しくお願いいたします。

  • テーブルを使った置換

    Access2002 Accessでクエリ実行時に特定の文字列を置換したいと思っています。 今までは置換する文字列が1つだけだったので、replace関数を使って直接置換する文字列を書いていたのですが、置換する文字列が今後増えてきそうなのでテーブルで管理したいと思っています。 置換用テーブル 元 ,置換後 000022,002078 000218,002403 000447,002703 クエリは単純な選択クエリなのですが、上記のようなテーブルを使ってクエリ実行時に文字を置換する方法がわかりません。 よろしくお願いします。

  • 正規表現で全角数字を半角数字に置換する方法は?

    いつもお世話になっております。 テキスト内の全角数字5桁のみを該当の半角数字5桁に置換する方法を探しています。 OS:Win テキストエディタ:sakuraエディタ、秀丸 例) ---------------------------------------- あいうえお01234かきくけこ99さしすせそ ↓ あいうえお01234かきくけこ99さしすせそ ---------------------------------------- 正規表現で行えばいいと思い、置換文字列を  [0-9][0-9][0-9][0-9][0-9] あるいは  [0-9]{5} にしましたが、置換後の文字列が分かりません。 試しに検索で上記の文字列を試すと、該当箇所がマークされるので、 置換前の文字列は合っています。 置換後の文字列をご教授願えますでしょうか。 ※テキストエディタで無理ならプログラム組みます。 VBScriptを考えていますが、他に良い言語があれば併せて教えてください。

  • Javascript の文字置換について

    Javascript の文字置換について質問致します。 <!-- 文章 --> こんにちは。 <!-- 文章2 --> 上記の様なコメントで囲まれた文字を削除し、コメント以外のみを抽出するにはどのようにするとよろしいでしょうか? 抽出後は、 こんにちは。 のみが抽出されます。

  • エクセル2003での置換について教えてください。

    エクセル2003での置換について教えてください。 こんにちは いつもお世話になっています エクセル2003での置換について教えてください。 特定の文字列以降の文字列を(特定文字列自身も含めて)削除したいのです。  特定の文字列は二つあります。【@】と【変化】です(【】も含みます)。  この二つの文字列はバラバラに出てきます。一方だけがでてくるセル、両方出てくるセル、両方出てこないセル、があるという意味です。  「*」を各特定文字の後ろに付けて、置換機能で削除していますが、二つの文字列に対して別々にやっています。 これを一度で置換して削除する方法を教えてください。  よろしくお願いします。

  • 数字のみを置換するバッチファイル

    いまテキストファイル内の文字列を置換するbatファイル(VBScript)を作成しているのですが、少し困っています。 ファイル内に英文字と数字が入り混じってる中(1000行くらい)で5文字以上連続する数字のみを置換したいのですが、どなたかアドバイス頂けないでしょうか?? ----------------------------------------------------------------- 例:以下のような文字列があって5文字以上連続した数字を全て■で置換 『iedds0123456ecefafa03223』  ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 『iedds■■■■■■■ecefafa■■■■■』 -----------------------------------------------------------------

専門家に質問してみよう