C#でCSVファイルを読み込む便利なクラス
備忘録:C#でCSVを読み込む便利な方法
TextFieldParserクラスを利用する。
CSVファイルはグローバルでは何となく共通のやり方になっているのだけれども、国内ではCSVデータの文字で改行はダメとかいろいろある。
めんどくさい。
テキストファイル読む系ならFileOpenクラスや、StreamReaderで読んで、それがCSVなら、Splitでカンマでぶった切るようなやり方になるけれど、CSVのデータ " \n "の改行は別の行として読まれてしまい、不都合が多い。
ダブルクオーテーションのマークを追ったりするやり方になるけれど、無駄に感じてきた。
という事で、TextFiledParserを使うサンプルをポイっとした。
モールショップ系の商品CSVデータって、まさに文中に改行されまくりなので、CSVのRFC仕様マックすで実装する必要がです。
TextFieldParserクラスを使うと、他の言語と違ってめちゃくちゃシンプルに改行込みCSVが簡単に読み取れる。
参照設定:Microsoft.VisualBasic.FileIO
必須なポイントだけ色付けた。
データを読み取る前にDelimiterを設定するところが、StreamReaderでやるのとTextFieldParserでやるのとで異なるところで他は基本的に同じ。
他の言語だと...読み込む為に別でクラス作ったりとか考えただけでめんどくさ過ぎてぞっとする。
TextFieldParserを使うことは難易度高いみたいな雰囲気な事言う人いるけれど、StreamReaderでやる方が実装コード数が圧倒的に上がるから、こっちの方が断然難易度低いと思う。
サンプルのは読んで吐くみたいなコードだけれども、色がついている所だけが読むのに肝心。
using (Microsoft.VisualBasic.FileIO.TextFieldParser sr = new Microsoft.VisualBasic.FileIO.TextFieldParser(itemFileName, System.Text.ASCIIEncoding.GetEncoding("shift-jis")))
rtn_ItemFileName = System.IO.Path.GetDirectoryName(itemFileName) + "\\" + string.Format("{0:yyyyMMddhhmmss}", DateTime.Now) + "_item.csv";
sr.TextFieldType = FieldType.Delimited;
sr.SetDelimiters(",");
while (!sr.EndOfData)
{
LineNo++;
string[] ReadLine = sr.ReadFields();
for (Int32 idx = 0; idx <= ReadLine.Length - 1; idx++)
}
}
{
rtn_ItemFileName = System.IO.Path.GetDirectoryName(itemFileName) + "\\" + string.Format("{0:yyyyMMddhhmmss}", DateTime.Now) + "_item.csv";
using (StreamWriter sw = new StreamWriter(rtn_ItemFileName, false, System.Text.ASCIIEncoding.GetEncoding("shift_jis")))
{
sr.TextFieldType = FieldType.Delimited;
sr.SetDelimiters(",");
while (!sr.EndOfData)
{
LineNo++;
if (Purge.Where(x => x.PurgeCommodityCode == ReadLine[1].Replace("\"", "")).Count() > 0)
{
PurgeList.Add(ReadLine[1].Replace("\"", ""));
continue;
}
else if (ReadLine[2].IndexOf("-") >= 0 || ReadLine[2].Length <= 1)
{
PurgeList.Add(ReadLine[1].Replace("\"", ""));
continue;
}
else
{
for (Int32 idx = 0; idx <= ReadLine.Length - 1; idx++)
{
sw.Write("\"" + ReadLine[idx].Replace("\"", "\"\"") + "\"");
if (idx != ReadLine.Length - 1)
{
sw.Write(",");
}
else
{
sw.Write("\n");
}
}
}}
}
}