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ファイル」という言葉に踊らされないように気を付けましょう。