• 締切済み

VBAでテキストファイル中の文字列を抽出したい

cj_moverの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

#1、cjです。追加レスです。 うっかり、安直過ぎました。 #1は、「"ネコ"を含む行の先頭文字列(数字)」を返すものなので、 "ネコ"に部分一致する"ヤマネコ"等にもヒットしてしまいますから、実用的でありませんでした。 完全一致版を(性質が大きく異なる)2種、挙げておきます。 "・"や"、"が区切り文字として(確実に)(全角で)使われていることが絶対条件になります。 「Sub testA()」「Sub testC()」を実行してテストしてみてください。 (◆の行の指定は確実に、、、) /// ' ' 次行以下、標準モジュール の先頭から 不足なく Option Explicit Private Const sFolPath As String = "D:\日別訪問動物\"  '  ◆ フォルダパス&\ 正しく指定 Private Const sKeysA = "サル,イヌ,カエル,カワウソ,ライオン,ゾウ,オオカミ,トラ,ネコ,クマ,カバ"  '  ← テスト用便宜上の定数 Private cn As Long  '  ← テスト用便宜上の変数 Sub testA()   For cn = 0 To 10     Re8464141a   Next cn End Sub Sub Re8464141a()   Dim rtn  '  戻り値   Dim sKey As String  '  検索キーワード   Dim sFormatPtr As String  '  日付値を基に各テキストファイル名(フルパス)を整形するパターン   Dim sMatchPtr As String  '  検索キーワードを区切り文字で挟んで完全一致を図る検索パターン   Dim sFile As String  '  各テキストファイル名   Dim sTempLine As String  '  各テキストデータを行単位で読込む変数   Dim nlen As Long  '  検索キーワードの文字長   Dim nPos As Long  '  検索キーワードがヒットした桁位置   Dim i As Long  '  ループ用(日付値相当)   Dim nFree As Integer  '  テキスト読み込み用空きナンバー   sFormatPtr = """" & sFolPath & """yyyymmdd"".txt"""   sKey = Split(sKeysA, ",")(cn)  '  ←テスト用便宜上の記述。  ◆ 検索キーワード、正しく指定   sMatchPtr = "*・*[・、]" & sKey & "、*"   nlen = Len(sKey)   nFree = FreeFile   For i = Date To Date - 365 Step -1     sFile = Format(i, sFormatPtr)     If Dir(sFile) <> "" Then       Open sFile For Input As #nFree       Do While Not EOF(nFree)         ' ' テキストデータを一行ずつ変数に読み込む         Line Input #nFree, sTempLine         nPos = InStr(sTempLine, sKey)         If sTempLine & "、" Like sMatchPtr Then           rtn = Trim$(Split(sTempLine, "・")(0))           Close #nFree           Exit For         End If       Loop       Close #nFree     End If   Next i   Dim nR As Long   If IsEmpty(rtn) Then     MsgBox "notfound"   Else '    Debug.Print "■"; rtn; "■"; sKey; "■"; Format(i, "yyyymmdd")     With Sheets("Sheet1")  '  ◆ シート名、正しく指定       nR = .Cells(Rows.Count, 1).End(xlUp).Row + 1       .Cells(nR, 1) = rtn  '  A列 に "何匹?"       .Cells(nR, 2) = sKey  '  B列 に "どの動物?"       .Cells(nR, 3) = Format(i, "yyyymmdd")  '  C列 に "いつ?"     End With   End If End Sub Sub testC()   For cn = 0 To 10     Re8464141c   Next cn End Sub Sub Re8464141c()   Dim rtn  '  戻り値   Dim oFSO As Object  '  As Scripting.FileSystemObject  '   Dim oRegExp As Object  '  As VBScript_RegExp_55.RegExp  '     Dim sKey As String  '  検索キーワード   Dim sFormatPtr As String  '  日付値を基に各テキストファイル名(フルパス)を整形するパターン   Dim sFile As String  '  各テキストファイル名   Dim sBuf As String  '  各テキストデータを流し込む変数   Dim i As Long  '  ループ用(日付値相当)   Dim flgHit As Boolean  '  各テキストファイルでマッチするかどうかフラグ   sFormatPtr = """" & sFolPath & """yyyymmdd"".txt"""   sKey = Split(sKeysA, ",")(cn)  '  ←テスト用の記述。  ◆ 検索キーワード、正しく指定 ' ' RegExp(正規表現)   Set oRegExp = CreateObject("VBScript.RegExp") ' New VBScript_RegExp_55.RegExp   With oRegExp     .Global = True     .Pattern = "(^|[\r\n])[\s\t ]*([^\s\t ・]+)・[^\n]+[・、]" & sKey & "([\r\n、]|$)"   End With ' ' FSO(ファイルシステムオブジェクト)   Set oFSO = CreateObject("Scripting.FileSystemObject")  ' New Scripting.FileSystemObject   For i = Date To Date - 365 Step -1     sFile = Format(i, sFormatPtr)     If oFSO.FileExists(sFile) Then       With oFSO.GetFile(sFile).OpenAsTextStream         sBuf = .ReadAll         .Close       End With       flgHit = oRegExp.test(sBuf)       If flgHit Then Exit For     End If   Next i   Dim nR As Long   If flgHit Then     rtn = oRegExp.Execute(sBuf)(0).SubMatches(1) '    Debug.Print "■"; rtn; "■"; sKey; "■"; Format(i, "yyyymmdd")     With Sheets("Sheet1")  '  ◆ シート名、正しく指定       nR = .Cells(Rows.Count, 1).End(xlUp).Row + 1       .Cells(nR, 1) = rtn  '  A列 に "何匹?"       .Cells(nR, 2) = sKey  '  B列 に "どの動物?"       .Cells(nR, 3) = Format(i, "yyyymmdd")  '  C列 に "いつ?"     End With   Else     MsgBox "notfound:" & sKey   End If   Set oFSO = Nothing:  Set oRegExp = Nothing End Sub

関連するQ&A

  • 複数のテキストから同じ行数の文字列を抽出し,別のテキストに出力する方法

    環境:linux,Windows XP よろしくお願いします.以下のようなデータが数千個あります. 2020-01-01_00.txt 2020-01-01,00,109.18970,18.36816,30.618,0.000,91.276,292.712 2020-01-01,00,109.54297,18.39178,30.676,0.000,90.044,292.653 2020-01-01,00,109.89642,18.41394,30.581,0.000,89.560,293.056 ・ ・ ・ ・ 2020-01-01_01.txt 2020-01-01,01,109.18970,18.36816,27.998,350.080,85.071,294.773 2020-01-01,01,109.54297,18.39178,28.187,355.642,86.229,294.425 2020-01-01,01,109.89642,18.41394,28.136,359.157,87.494,294.675 ・ ・ ・ ・ 2020-01-01_02.txt 2020-01-01,02,109.18970,18.36816,30.200,551.398,75.640,296.445 2020-01-01,02,109.54297,18.39178,30.356,556.004,79.117,295.921 2020-01-01,02,109.89642,18.41394,29.953,558.076,82.460,295.942 ・ ・ ・ ・ ここで,私がやりたいのは,同じディレクトリ内にある数千個のテキストから同じ行数の文字列を抽出し,別のテキストファイルに出力することです.つまり,結果の出力は以下のようにしたいのです. 109.18970,18.36816.txt 2020-01-01,00,109.18970,18.36816,30.618,0.000,91.276,292.712 2020-01-01,01,109.18970,18.36816,27.998,350.080,85.071,294.773 2020-01-01,02,109.18970,18.36816,30.200,551.398,75.640,296.445 ・ ・ ・ ・ 109.54297,18.39178.txt 2020-01-01,00,109.54297,18.39178,30.676,0.000,90.044,292.653 2020-01-01,01,109.54297,18.39178,28.187,355.642,86.229,294.425 2020-01-01,02,109.54297,18.39178,30.356,556.004,79.117,295.921 ・ ・ ・ ・ 109.89642,18.41394.txt 2020-01-01,00,109.89642,18.41394,30.581,0.000,89.560,293.056 2020-01-01,01,109.89642,18.41394,28.136,359.157,87.494,294.675 2020-01-01,02,109.89642,18.41394,29.953,558.076,82.460,295.942 ・ ・ ・ ・ 私なりに以下のshを作成しましたが,処理が通りません.間違えているところをご指摘いただけないでしょうか.よろしくお願いします. #!/bin/sh BUFIFS=$IFS IFS= exec 3< lonlat.txt while read FL 0<&3 for i in 2020-??-??_??.txt $data = cat $i | grep "$FL" $i print $data >> ./out/$FL done exec 3<&- IFS=$BUFIFS #lonlat.txtの内容は以下の通り 109.18970,18.36816 109.54297,18.39178 109.89642,18.41394     ・     ・     ・ #処理したものを/outに出力

  • SED等で文字列を抽出したい

    MacOS X 10.6のターミナルを使って文字列を加工して抽出する方法の質問です。 次のような複数行からなるテキスト(ファイル名を 1.txt とします)があります。 <a href="./hoge/82111.310.12345000.htm" target="_blank"> <a href="./hoge/42403.310.33345025.htm" target="_blank"> <a href="./hoge/22154.310.50873323.htm" target="_blank"> ... このテキスト(1.txt)から、sed(?もっと適切なものがあれば別のものでも)コマンド を用いて 82111.12345000.htm 82401.33345025.htm 82111.50873323.htm ... といった具合に、 hoge/ のあとから始まり htmで終わる文字列から .310を取り除いた文字列を抜き出して ファイル一覧のテキスト(2.txt) に書き出す方法を教えてください。 なお、1.txtの行数は不定で変動し、その行数に応じて2.txtも行数が増えていきます。 また htmのファイル名のところは 5桁のランダムな数字.310.8桁のランダムな数字.htm という規則になっています。(.310 と.htm の部分は固定です) よろしくお願いします。

  • テキストファイルの指定文字列表示2

    以前質問し、解決したかに見えたのですが、元ファイルに意外なケースがあることに気づき、再度質問させていただきます。 あるブラウザにて、あるテキストファイルの部分を抽出して表示させるスクリプトを考えております。 テキストファイル自体は同階層にあり(./aaa.txt)、不定期に更新されます。内容は下記<./aaa.txt>のような構成になっております。そして下段のphpスクリプト<vvv.php>ですと希望どおりに表示されるのですが、./aaa.txtファイルの中身は状況によっては空行が最初の1回しかないケースがあります。 その場合も、 222222222222 3333333333333 4444444444 のように"111111111111"を除いた、1回目の空行までは表示させたいのですが、何か良い方法はございますでしょうか? ※このようなファイルの場合<vvv.php>で実行すると、何も出力されません。 どうかご教授お願いいたします。 <./aaa.txt> ========= 111111111111 222222222222 3333333333333 4444444444 (空行) 55555555 6666666 66666666 8888888 (空行) 9999999999999999999999 ・ ・ ========= <vvv.php> ========= <?PHP function mytrim(&$item){//(1) $item=str_replace(Array("\r","\n"),Array("",""),$item); } $lines=file("./aaa.txt");//(2) array_walk($lines, 'mytrim');//(3) $blankline=array_keys($lines,"");//(4) $lastline=$blankline[1]-1;//(5) for($i=0;$i<=$lastline;$i++){ if($lines[$i]!="111111111111"){//(6) print $lines[$i]."<br>"; } } ?> =========

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

    テキストファイルの文字列を書き換えるスクリプトを考えています。 今、次のところまで出来るようになりました。本当は「こんにちは」の文字列を全て「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

  • 肛門腺のある動物

    肛門腺はイヌ・ネコに共通してあるようですが、トラやライオン、イタチやテン、そのほかの動物にもあるのでしょうか? 猫の仲間でも単独行動を好む動物にも肛門腺をもつものはいますか?

  • VBAでWordやExcelのテキスト全文抜き出し

    表題のとおりです! フォルダ内に複数あるWordやExcelファイルを一度に処理したいと考えています。 以下の仕様を満たせられば文句なしです!! ・テキストボックスや図中テキストについても、出現順に抽出したい ・余計な制御記号は抽出不要 ・抽出したテキストはtxt形式で同名保存したい VBA初心者でもわかりやくご教授お願いします。

  • 食物繊維の順番に並べてください

    以下の動物を、食物繊維における「食べられる→食べる」の順番に並べてください。 (例:シマウマ→ライオン) 語群 イヌ ネコ ウサギ ヒツジ キツネ オオカミ ライオン コヨーテ

  • 食物連鎖の順番に並べてください

    以下の動物を、食物連鎖における「食べられる→食べる」の順番に並べてください。 (例:シマウマ→ライオン) 語群 イヌ ネコ ウサギ ヒツジ キツネ オオカミ ライオン コヨーテ

  • Excelで複数の他のファイルから、データを抽出

    フォルダに30個~40個のxlsファイルがあり、中身はmmddというシート名で日別に分かれています。 抽出を実行した日(たとえば今日なら0122)と、同じ名前のシートのA1~D4までの文字列データを、 抽出を実行したシートのA1~D4に貼り付け、2個目のxlsファイルから抽出したデータはA6~D9に、3個目はA11~D14に貼り付ける…という風な抽出をしてくれるようにしたいと考えております。 関数かVBAにて処理する方法はありますでしょうか? ご教授願います。

  • phpでテキストファイルの特定のワードを抽出

    タイトルの通りです。 phpを使い、テキストファイルの中に書かれている文字列をhtmlに表示することはできました。 <?php //ファイルを開く //モード[r]の読み込み専用 if (! ($fp = fopen ( "list.txt", "r" ))) { echo "ファイルが開けません。"; } while (! feof ($fp)) { $load = fgets ($fp, 4096); echo $load; } ?> このような感じです。 ですが、テキストファイルの中の特定の文字(例:美しい)を抽出したいのですが、どのようにプログラムを書いて良いかわかりません。 どなたかアドバイスをお願いします。

    • 締切済み
    • PHP