「C Sharpの基礎 - ファイル」の版間の差分

ナビゲーションに移動 検索に移動
編集の要約なし
268行目: 268行目:
  {
  {
     Console.WriteLine(ex.Message);
     Console.WriteLine(ex.Message);
}
</syntaxhighlight>
<br><br>
== CSVファイル ==
CSVファイルを読み込むには、.NET Framework 2.0で追加された<code>TextFieldParser</code>クラス(<code>Microsoft.VisualBasic.FileIO</code>名前空間)を使用する。<br>
<code>TextFieldParser</code>クラスを使用することで、CSVファイルを読み込み、各行の各フィールドの文字列を簡潔に取得することができる。<br>
<br>
==== CSVファイルを読み込む ====
<code>TextFieldParser</code>クラスを使用してCSVファイルを読み込むには、<br>
まず、<code>TextFieldParser</code>クラスのコンストラクタに処理するCSVファイルを指定して、インスタンスを生成する。<br>
CSVファイルに日本語が含まれている場合は、文字コードを指定する。<br>
<syntaxhighlight lang="c#">
using System.Text;
using Microsoft.VisualBasic.FileIO;
var parser = new TextFieldParser(@"hoge.csv", Encoding.GetEncoding("Shift_JIS"));  // 文字コードはShift-JISを指定する
</syntaxhighlight>
<br>
次に、<code>TextFieldType</code>プロパティに<code>FieldType.Delimited</code>を指定する。<br>
もし、<code>FieldType.FixedWidth</code>を指定する場合、フィールドが固定幅のファイルも扱うことができる。<br>
<br>
また、<code>SetDelimiters</code>メソッドを使用して、区切り文字を指定する。(複数の区切り文字が指定可能)<br>
CSVファイルの場合は、<code>,</code>(カンマ)を指定する。<br>
<syntaxhighlight lang="c#">
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");  // 区切り文字はカンマを指定する
</syntaxhighlight>
<br>
<code>TextFieldParser</code>クラスの<code>ReadFields</code>メソッドを実行するごとに、CSVファイルを1行ずつ読むことができる。<br>
<code>ReadFields</code>メソッドは、読み込んだレコードの全てのフィールドを文字列配列に変換して返す。<br>
次のレコードが存在するかどうかは<code>EndOfData</code>プロパティにより判定できるため、ループにより、CSVファイル全体を処理できる。<br>
<syntaxhighlight lang="c#">
while (!parser.EndOfData)
{
    // 配列rowの要素は読み込んだレコードの各フィールドの値
    string[] row = parser.ReadFields();  // 1レコード読み込む
}
</syntaxhighlight>
<br>
==== CSVファイルを読み込み表示する ====
以下の例では、hoge.csvファイルを読み込み、各フィールドを切り出してタブ区切りで画面に出力する。<br>
改行文字および空白文字がどのように処理されるかを分かりやすくするために、それぞれをnと_に置換して出力している。<br>
<br>
* <code>HasFieldsEnclosedInQuotes</code>プロパティ
*: フィールドに改行やデリミタを含める為に引用符を使っているようなフォーマットを考慮する場合は、
*: <code>HasFieldsEnclosedInQuotes</code>プロパティを<code>true</code>に設定する。(初期値はtrue)
* TrimWhiteSpaceプロパティ
*: フィールドの前後の空白文字を削除しない場合は、<code>TrimWhiteSpace</code>プロパティを<code>false</code>に設定する。(初期値はtrue)
<br>
<syntaxhighlight lang="c#">
using System;
using System.Text;
using Microsoft.VisualBasic.FileIO;
class CSVParser
{
    static void Main()
    {
      using (var parser = new TextFieldParser("text.csv", Encoding.GetEncoding("Shift_JIS")))
      {
          parser.TextFieldType = FieldType.Delimited;  // フィールドはデリミタにより区切る(可変)
          parser.Delimiters = new[] {","};            // 区切り文字を指定
          parser.CommentTokens = new[] {"#"};          // #で始まる行をコメントとする
          // parser.HasFieldsEnclosedInQuotes = false; // 引用符で括られたフィールドを持つか指定
          // parser.TrimWhiteSpace = false;            // フィールドの前後に含まれる空白を削除するか指定
          while (!parser.EndOfData)
          {
            try
            {
                string[] row = parser.ReadFields(); // 1行読み込む
                foreach (string field in row)
                {
                  field = field.Replace("\r\n", "n"); // 改行をnに置換
                  field = field.Replace(" ", "_");    // 空白を_に置換
                  Console.Write(field + "\t");    // タブ区切りで出力
                }
                Console.WriteLine();
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
          }
      }
    }
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>

案内メニュー