[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.029 テキストファイル処理 ファイルからの読み込み

テキストファイル処理 ファイルからの読み込み

メルマガ発行内容

<テキストファイル処理 ファイルからの読み込み>

こんにちは、三流プログラマーKen3です。 今回は、 テキストファイルからのデータ読み込み処理をやってみたいと思います。 あまり自分でテキストファイルを読んで処理する機会は無いと思うので、 (CSVとかのテキスト読み込みが充実してると思うので) 気楽に読んでください。 /* * 1. テキストファイルの仕様 と やりたいこと */ Excelの開くで*.CSVとか*.TXT開けるのですが、 今回は自分で開いて読み込んでみます。 やりたいこと、 ログの収集用のファイルが存在して、 下記のようなフォーマットでデータをもらうことができます。 ファイル名はlog.csvで、 中身は、簡単に時間とアクセス場所が入ってます 17/Dec/2002:11:25:33,GET /vba/excel97-vba-test.html HTTP/1.0 17/Dec/2002:11:26:09,GET /backno/backno_vba_mokuji.html HTTP/1.0 17/Dec/2002:11:26:41,GET /24h/index.html HTTP/1.0 17/Dec/2002:11:26:41,GET /24h/menu24h.html HTTP/1.0 17/Dec/2002:11:27:11,GET /vba/lzh/vba006.lzh HTTP/1.0 17/Dec/2002:11:27:42,GET /24h/info24h.html HTTP/1.0 17/Dec/2002:11:28:18,GET /backno/backno_vba03.html HTTP/1.0 17/Dec/2002:11:33:16,GET /backno/backno_guchi05.html HTTP/1.1 17/Dec/2002:11:37:48,GET /backno/backno_guchi06.html HTTP/1.1 17/Dec/2002:11:41:30,GET /asp/iis-help.html HTTP/1.0 17/Dec/2002:11:41:30,GET /asp/gif/iis-help03.gif HTTP/1.0 17/Dec/2002:11:41:30,GET /asp/gif/iis-help04.gif HTTP/1.0 まず私が気になることは(気にしてることは) アクセス場所も気になるんだけど、 17/Dec/2002:11:27:11,GET /vba/lzh/vba006.lzh HTTP/1.0 保存したサンプルを使ってくれてるのかなぁ? です。 やりたいこと、機能としては、 読み込みと書き込みの練習を兼ねて、 log.csvの元ファイルを読み込み、 XXXX.lzhの行を見つけたら、 out.txtに書き込んでください。 /* * 2.まずは、読み込みのテストかなぁ */ '一行読み込みのLine Input # ステートメントをテスト Sub test029_1() Dim strInFileName As String '入力ファイル名 Dim strBUFF As String 'レコードを読みこむバッファ strInFileName = ThisWorkbook.Path & "\log.csv" 'ファイル名を作る 'ファイルの存在チェック If Dir(strInFileName) = "" Then MsgBox strInFileName & "が見つかりません" Exit Sub End If 'ファイルを入力モードで開く Open strInFileName For Input As #1 'Line Input # ステートメントを使用 Line Input #1, strBUFF MsgBox strBUFF 'ファイルは閉じようね Close #1 End Sub '---- ファイル名の作成 ^^^^^^^^^^^^^^^^ strInFileName = ThisWorkbook.Path & "\log.csv" 'ファイル名を作る おなじみの、ThisWorkbook.Pathと名前をつなげてますね。 (いつからActiveWorkbook.PathからThisWorkbook.Path好きになったの?) ファイルが存在するかチェックする ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 'ファイルの存在チェック If Dir(strInFileName) = "" Then MsgBox strInFileName & "が見つかりません" Exit Sub End If Dir関数で、開く前にファイルが存在するかチェックしてます。 これも、毎度のパターンかなぁ。 ファイルが無い場合は、メッセージを表示して、 Exit Subでバイバイします。 開いて、 ^^^^^^ 'ファイルを入力モードで開く Open strInFileName For Input As #1 ポイントはFor Inputです。 読んで ^^^^^^ 'Line Input # ステートメントを使用 Line Input #1, strBUFF MsgBox strBUFF ポイントは、 Line Input #ファイル番号, 変数 で、データを一行読み込みます。 ここでは、そのまま表示してます。 また閉じて ^^^^^^^^^^ 'ファイルは閉じようね Close #1 無事、1行目が表示されたと思います。 /* * 3.ファイルの行数を数えてみた EOF関数使用 */ ファイルの終わりを知りたかったので、 EOF関数のテストを兼ねて、データ行数をカウントしてみた。 'EOF関数でファイルの終端をチェックする Sub test029_2() Dim strInFileName As String '入力ファイル名 Dim strBUFF As String 'レコードを読みこむバッファ Dim nCNT As Integer 'レコード数を数える strInFileName = ThisWorkbook.Path & "\log.csv" 'ファイル名を作る 'ファイルの存在チェック If Dir(strInFileName) = "" Then MsgBox strInFileName & "が見つかりません" Exit Sub End If 'ファイルを入力モードで開く Open strInFileName For Input As #1 'ファイルの行数を数える nCNT = 0 Do While EOF(1) = False 'ファイル番号1が終了じゃない間まわる Line Input #1, strBUFF 'ここでは空読みで1行読む nCNT = nCNT + 1 '行数をカウントする Loop 'ファイルは閉じようね Close #1 '結果を表示 MsgBox strInFileName & "は" & nCNT & "行です" End Sub ポイントは、ファイルの行数を数える部分で、 カウンタの初期化 ^^^^^^^^^^^^^^^^ nCNT = 0 ループの条件をファイルの終端にする ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do While EOF(1) = False 'ファイル番号1が終了じゃない間まわる EOF(ファイル番号)は、 ファイルが終端になると、Trueを返し、 途中(まだ読める)だとFalse なので、Falseの間、まわるループにした。 データの空読み ^^^^^^^^^^^^^^ Line Input #1, strBUFF 'ここでは空読みで1行読む 何も処理しないんだけど、1行読んでstrBUFFに代入した。 カウントアップ ^^^^^^^^^^^^^^ nCNT = nCNT + 1 '行数をカウントする 普通にA=A+1みたいな感じで、1を加算、カウントアップした。 ループの最後 ^^^^^^^^^^^^ Loop は、ループはここまで、うえのDo Whileに戻ります。 無事行数はカウントされましたか? /* * 4.読んで、該当データを別ファイルに書く */ やっと、今日もまもなく終了です。 次は、データを読みこんで、 条件をチェック(ここでは、.lzhか?) 該当データを別ファイルに書き込みます。 '読んで、判断して、書き込む Sub test029_3() Dim strInFileName As String '入力ファイル名 Dim stroutFileName As String '出力ファイル名 Dim strBUFF As String 'レコードを読みこむバッファ Dim nCNT As Integer 'レコード数を数える '入力ファイル関係の処理 strInFileName = ThisWorkbook.Path & "\log.csv" '入力ファイル名を作る If Dir(strInFileName) = "" Then 'ファイルの存在チェック MsgBox strInFileName & "が見つかりません" Exit Sub End If Open strInFileName For Input As #1 'ファイルを入力モードで開く '出力ファイル関係の処理 stroutFileName = ThisWorkbook.Path & "\out.txt" '出力ファイル名を作る Open stroutFileName For Output As #2 'ファイル番号2で出力ファイル作成 nCNT = 0 '出力行カウンタを初期化 '入力ファイルの最後まで1行毎に読んで判断する Do While EOF(1) = False 'ファイル番号1(入力)がある間ループ Line Input #1, strBUFF 'ここで1行読む '.lzhがあるかInStr関数で探す If InStr(strBUFF, ".lzh") <> 0 Then Print #2, strBUFF 'ファイルに書き込む nCNT = nCNT + 1 '出力行数をカウントする End If Loop 'ファイルは閉じようね Close #1 '入力ファイル Close #2 '出力ファイルも忘れずに '結果を表示 MsgBox stroutFileName & "に" & nCNT & "件書き込みました" End Sub 入力ファイルの準備 ^^^^^^^^^^^^^^^^^^ '入力ファイル関係の処理 strInFileName = ThisWorkbook.Path & "\log.csv" '入力ファイル名を作る If Dir(strInFileName) = "" Then 'ファイルの存在チェック MsgBox strInFileName & "が見つかりません" Exit Sub End If Open strInFileName For Input As #1 'ファイルを入力モードで開く いつものようにファイル名を作成、 で、存在をチェックして、 オープンします。 出力ファイルの準備 ^^^^^^^^^^^^^^^^^^ '出力ファイル関係の処理 stroutFileName = ThisWorkbook.Path & "\out.txt" '出力ファイル名を作る Open stroutFileName For Output As #2 'ファイル番号2で出力ファイル作成 nCNT = 0 '出力行カウンタを初期化 ファイル名を作成、 書き込みなのでノーチェックで出力モードでオープン カウンタも初期化しておきます。 ファイルを読んで、判断して、書き出して ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ '入力ファイルの最後まで1行毎に読んで判断する Do While EOF(1) = False 'ファイル番号1(入力)がある間ループ Line Input #1, strBUFF 'ここで1行読む '.lzhがあるかInStr関数で探す If InStr(strBUFF, ".lzh") <> 0 Then Print #2, strBUFF 'ファイルに書き込む nCNT = nCNT + 1 '出力行数をカウントする End If Loop ここのポイントは、 InStr関数を使って、 読み込んだデータstrBUFFに .lzhの文字列が存在するかチェックして、 <>0 データが見つかった時に、 Print #2, strBUFF で、読み込んだデータをそのまま出力してます。 この処理で、抜き出したような感じの出力ファイルが出来あがります。 最後の後始末はファイルを閉める ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 'ファイルは閉じようね Close #1 '入力ファイル Close #2 '出力ファイルも忘れずに 忘れないで、#2も閉じてくださいね。 結果の報告 ^^^^^^^^^^ '結果を表示 MsgBox stroutFileName & "に" & nCNT & "件書き込みました" 作業が終わったのに黙って帰るなんてのは、社会人失格、、、 なんて話じゃなくって、 書き込み件数を表示して、作業の終了を知らせてます。 /* * 5.終わりの挨拶 */ 今回は、 ・Input Line #で1行リード ・EOF(No) で、ファイルの終わりをチェック ・Instr関数で文字列を探した でした。 今回のサンプルは、 http://www.ken3.org/vba/lzh/vba029.lzh に test029-book.xlsとlog.csvが保存されてます。 log.csv(元データ)の内容を変えたりして、 遊んでください。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]