0
0

More than 3 years have passed since last update.

[続] CSVを読み込もう

Last updated at Posted at 2021-08-31

CSVデータを読み込もう

前回、頑張ってCSVファイルを読み解いた
CSVを読み込もう

でも追伸で書いた通りなんかデータがおかしい。
調べていくと実際はこんなファイルだった。

ItemName1, ItemName2,ItemName3 ,ItemName4,
0,AN000012,東京      ,埼玉        ,
1,AN000022,東京      ,神奈川,千葉     ,

んー基本カンマで区切られていると思いきや、不正っぽいデータがあるなぁ・・・



ん!?これ、データに相当する行は固定長ファイルよね?多分。
でもヘッダーは普通のカンマ区切り・・・でもないな。
固定長っぽいけど固定長ではない感じ。また2行目以降のデータ数とは異なる・・・
しれっとこんなデータを作るんじゃないよ・・・・

取り込み

こんな感じの処理を考えてみた。

static Encoding encoding = Encoding.GetEncoding("Shift_JIS");

struct CsvRecord
{
    public string ItemName1;
    public string ItemName2;
    public string ItemName3;
    public string ItemName4;
}

private static DataTable CreateDataTable()
{
    DataTable dataTable = new DataTable();

    // 型付DataTable作成
    dataTable.Columns.AddRange(
        new DataColumn[]
        {
            new DataColumn("dtField1", typeof(Int32)),
            new DataColumn("dtField2", typeof(string)),
            new DataColumn("dtField3", typeof(string)),
            new DataColumn("dtField4", typeof(string)),
        });
     return dataTable;
}

private static List<CsvItem> GetCsvData(string targetFile)
{
    List<CsvItem> result = new List<CsvItem>();

    using (System.IO.StreamReader sr = new System.IO.StreamReader(targetFile, encoding))
    {
        // ヘッダ相当の行を空読み
        sr.ReadLine();

        CsvItem temp;
        byte[] byteArray;

        while(!sr.EndOfStream)
        {
            byteArray = encoding.GetBytes(sr.ReadLine());
            temp = new CsvItem();

            // 0バイト目から1バイト分切り出して文字列化
            temp.ItemName1 = encoding.GetString(byteArray, 0, 1).Trim();
            temp.ItemName2 = encoding.GetString(byteArray, 2, 8).Trim();
            temp.ItemName3 = encoding.GetString(byteArray, 11, 16).Trim();
            temp.ItemName4 = encoding.GetString(byteArray, 28, 16).Trim();

            result.Add(temp);
        }
    }
    return result;
}

public static DataTable ReadData(string targetFile)
{
    // 型付DataTable作成
    var resultDataTable = CreateDataTable();

    // CSVファイル読み込み
    List<CsvItem> CsvItems = GetCsvData(targetFile);

    foreach (CsvItem csvItem in CsvItems)
    {
        // DataRow化してDataTableに追加
        resultDataTable.Rows.Add(
            csvItem.ItemName1,
            csvItem.ItemName2,
            csvItem.ItemName3,
            csvItem.ItemName4
        );
    }
    return resultDataTable;
}

最終的にDataTableで処理する必要があったのでこういう風になりました。

最後に

「CSVファイル」という言葉に踊らされないように気を付けましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0