連載:VB 6ユーザーのための
これならマスターできるVB 2005超入門

第8回 ファイル入出力をマスターしよう

羽山 博
2007/04/20
Page1 Page2 Page3 Page4

サンプル・プログラム12 − ファイルに追加書き込みするには

 ファイルにデータを書き込む方法にもさまざまなバリエーションがあるが、ここでは、追加書き込みのコードを見てみることとする。入力ファイルはこれまで使ってきたattend.logをそのまま使い、この中から、指定した学生番号を含む行の第2フィールドだけを取り出し、attend.outファイルに書き込むものとする。

 例えば、「01234567」という学生番号を入力し、[検索]ボタンをクリックすると、図5のようになる。


図5 行とフィールドを切り出して別のファイルに出力する
フィールドの区切りはカンマ。指定された学生番号と第1フィールドが等しい行の、第2フィールドだけを出力する。

 まずは入力から見てみよう。これはStreamReaderクラスのオブジェクトを使い、ファイルから1行ずつデータを読み出して、文字列処理によってフィールドごとに分けるという方法でも構わないが、フィールドごとの処理ができるFileIO.TextFieldParserというクラスがあるので、それを利用すると簡単になる。

.NET TIPS:CSVファイルを読み込むには?

 このクラスでは、SetDelimiterメソッドを使って、フィールドの区切り文字を指定することができ、ReadFieldsメソッドを使って、1行のデータを読み込み、フィールドを文字列の配列として返すことができる。従って、入力のためのコードは以下のようになる。取りあえず、ファイルへの出力は後で考えることとして、デバッグ・ウィンドウに出力してみよう。

Private Sub countNumber(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click

  Dim tr As FileIO.TextFieldParser
  Dim oneLine As String()

  tr = New FileIO.TextFieldParser("c:\Home\attend.log") 
  tr.SetDelimiters(":")

  Do While Not tr.EndOfData
    oneLine = tr.ReadFields()
    If oneLine(0) = txtNumber.Text Then
      Debug.Print(oneLine(1))
    End If
  Loop

  tr.Close()
End Sub
リスト4 指定された学生番号を含む行の第2フィールドだけを取り出すためのコード
  TextFieldParserクラスの新しいオブジェクトを作成する。
  SetDelimitersメソッドでフィールドの区切り文字を指定する。
  EndOfDataプロパティがTrueにならない間(データがある間)、繰り返す。
  ReadFieldsメソッドで1行のデータを読み込み、フィールドごとに分けて文字列の配列に入れる。
  第1フィールドが学生番号と等しい行の、第2フィールドをデバッグ・ウィンドウに出力する。

 TextFieldParserクラスのEndOfDataプロパティは、ファイルの末尾に達したかどうかではなく、ファイルの末尾の前に空白行やコメント行(CommnetTokensプロパティに設定した文字列で始まる行)だけがある行に達したらTrueになることに注意。また、配列のインデックスは0から始まるので、第1フィールドはoneLine(0)のように配列の0番目の文字列となっていることにも注意しよう。

 では、次に、ファイルに書き込むためのコードを追加してみよう。ストリームへの書き込みはStreamWriterクラスのオブジェクトを使い、1行のデータを書き込むにはWriteLineメソッドが使えるので、以下のようになる。

Private Sub countNumber(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click

  Dim tr As FileIO.FieldParser
  Dim fs As FileStream
  Dim sw As StreamWriter
  Dim oneLine As String()

  Try
    tr = New FileIO.TextFieldParser("c:\Home\attend.log")
    fs = New FileStream("c:\Home\attend.out", FileMode.Append, FileAccess.Write)
    sw = New StreamWriter(fs)
    tr.SetDelimiters(":")

    Do While Not tr.EndOfData
      oneLine = tr.ReadFields()
      If oneLine(0) = txtNumber.Text Then
        sw.WriteLine(oneLine(1))
      End If
    Loop

    tr.Close()
    sw.Close()
    fs.Close()
  Catch ex As Exception
    MessageBox.Show("ファイル入出力でエラー発生")
  End Try
End Sub
リスト5 指定された学生番号を含む行の第2フィールドだけをファイルに出力するためのコード
  FileStreamクラスの新しいオブジェクトを作成する。モードは追加書き込み。
  StreamWriterクラスの新しいオブジェクトを作成する。 で作成したストリームを利用する。
  WriteLineメソッドでファイルに1行書き込む。

結び − エラー処理も重要

 ファイル回りの処理では、ファイルが存在しなかったり、フィールドの形式が期待していたものと違ったりと、何かとエラーが発生することが多い。最後に示したコードでは、Try 〜 Catch 〜 End Tryステートメントを使った、幾分おおざっぱなエラー処理を入れておいたが、実際のプログラムでは、そのあたりについても十分に考慮する必要があるだろう。

 エラー処理についてはこの連載の第4回で説明しているのでそちらも参照されるといいだろうEnd of Article


 INDEX
  連載:VB 6ユーザーのためのこれならマスターできるVB 2005超入門
  第8回 ファイル入出力をマスターしよう
    1.サンプル・プログラム10 − テキスト・ファイルの検索プログラム
    2.テキスト・ファイルからデータを読み出せるようにするには
    3.サンプル・プログラム11 − ランダム・アクセスでデータを読み出すには
  4.サンプル・プログラム12 − ファイルに追加書き込みするには
 
インデックス・ページヘ  「これならマスターできるVB 2005超入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH