Translate

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";
                using (StreamWriter sw = new StreamWriter(rtn_ItemFileName, false, System.Text.ASCIIEncoding.GetEncoding("shift_jis")))
                {

                    sr.TextFieldType = FieldType.Delimited;
                    sr.SetDelimiters(",");

                    while (!sr.EndOfData)
                    {

                        LineNo++;
                        string[] ReadLine = sr.ReadFields();

                        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");
                                }
                            }
                        }

                    }

                }
            }

このブログの人気の投稿

VBAのADOで「パラメーターが少なすぎます。xを指定してください。」と表示された場合の原因

ACCESSでバーコードスキャンしたら自動でイベントを起こす方法

PostgreSQL 11 でpg_dumpallを使ってバックアップしたデータをリストアするとき文字化けの対処法

ACCESSのVBAを実行するとACCESSが強制終了する事がある

VBSでマクロの実行時に警告を非表示にする方法

ACCESSでバーコードをスキャンして登録更新する簡単なサンプル

ACCESSのVBAでADOを利用したバインド変数を利用したデータベース連携方法

pgAdmin 4が遅いのは仕方がない | PostgreSQL things.

ACCESSのVBAでリストビュー(ListView)を使う為の設定 | Office365

ASP.NETのでクライアント証明書を使ったログイン認証を行う方法