• 締切済み

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

30246kikuの回答

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

私もやってみました 操作として、A列のどこかに「ネコ」と入力したら、 その横、B列に日付を、C列にx匹 を表示するものです。 フォルダの対象ファイル一覧を作った後、直近から Open 探す方法なので ファイル数が多ければ、それなりに遅くなると思います。 ファイル内の解釈は、 1行づつ読み込みます 「・」が無い行はスキップ 「・」があれば、「・」区切りの最後を「、」区切りで その区切ったものがA列に入力されたものだったら・・・・ という流れになっています。 (ベタな処理と思います) Private Sub Worksheet_Change(ByVal Target As Range)  Dim sKey As String  Dim oFso As Object  Dim sS As String  Dim sBuf As String  Dim sAry() As String  Dim v As Variant  Const CPATH = "D:\Hoge\日別訪問動物\"  Const CCHKMOJI = "・"  Const CSEPMOJI = "、"  Const adVarChar = 200  Const adUseClient = 3  Const adOpenStatic = 3  Const adLockOptimistic = 3  With Target   If ((.Count <> 1) Or (.Column <> 1)) Then Exit Sub   sKey = .Value   If (Len(sKey) = 0) Then Exit Sub   Application.EnableEvents = False   .Offset(, 1) = ""   .Offset(, 2) = ""   Application.EnableEvents = True  End With  Set oFso = CreateObject("Scripting.FileSystemObject")  With CreateObject("ADODB.Recordset")   .Fields.Append "F1", adVarChar, 255   .CursorLocation = adUseClient   .CursorType = adOpenStatic   .LockType = adLockOptimistic   .Open   For Each v In oFso.GetFolder(CPATH).Files    If (oFso.GetExtensionName(v.Name) = "txt") Then     sS = oFso.GetBaseName(v.Name)     If ((Len(sS) = 8) And (Not sS Like "*[!0-9]*")) Then      .AddNew      .Fields(0) = v.Name      .Update     End If    End If   Next   If (.RecordCount > 0) Then    .Sort = "F1 DESC"    Do While (Not .EOF)     sS = .Fields(0)     With oFso.OpenTextFile(CPATH & sS)      Do While (Not .AtEndOfStream)       sBuf = .ReadLine       If ((InStr(sBuf, CCHKMOJI) > 0) _        And (InStr(sBuf, sKey) > 0)) Then        sAry = Split(Trim(sBuf), CCHKMOJI)        For Each v In Split(sAry(UBound(sAry)), CSEPMOJI)         If (v = sKey) Then          Application.EnableEvents = False          With Target           .Offset(, 1) = Format(oFso.GetBaseName(sS), "@@@@/@@/@@")           .Offset(, 2) = sAry(0)          End With          Application.EnableEvents = True          Exit For         End If        Next        If (Not IsEmpty(v)) Then Exit Do       End If      Loop      .Close     End With     If (Not IsEmpty(v)) Then Exit Do     .MoveNext    Loop   End If   .Close  End With  Set oFso = 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