C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■86286 / 2階層)  C# csvファイル読み込みの質問です
□投稿者/ 魔界の仮面弁士 (1532回)-(2018/01/13(Sat) 15:47:46)
No86284 (WebSurfer さん) に補足
> 別の案(CSV パーサーの利用)を提案させてください。

CsvHelper なども有名ですね。
https://www.nuget.org/packages/CsvHelper/
http://joshclose.github.io/CsvHelper/reading#getting-all-records


> なので、TextFieldParser などの既存のパーサーを使うのがよさそうです。

Microsoft.VisualBasic.FileIO.TextFieldParser は確かに高機能ですが、
『空行を無視する』仕様になっていることにご注意ください。

この「空行を無視する」という TextFieldParser の制限により、
私が No86283 で例に挙げた CSV 群、たとえば:
>>> string strStream = "111\r\n\r\n333\r\n444";
などは、残念ながら正しく処理することができません。


> 改行コードやデリミタがフィールド値の中にある場合、

空行無視という制限により、TextFieldParser ではたとえば
 string strStream
   = "BARCODE,NAME\r\n"
   + "4901313037508,ソフトサラダ\r\n"
   + "4582409181895,\"選べる!\r\nみんなのスープ\r\n\r\n8袋入\"\r\n"
   + "4901990328544,\"ごつ盛 坦々麺\"\r\n";
のようなデータも正しく読み取れません。


上記の CSV データをパースした場合、たとえば
 var lines = new string[4][];
 lines[0] = new string[2] { "BARCODE", "NAME" };
 lines[1] = new string[2] { "4901313037508", "ソフトサラダ" };
 lines[2] = new string[2] { "4582409181895", "選べる!\r\nみんなのスープ\r\n\r\n8袋入" };
 lines[3] = new string[2] { "4901990328544", "ごつ盛 坦々麺" };
へと解釈されることが期待されるわけですが、
Microsoft.VisualBasic.FileIO.TextFieldParser では空行部が読み飛ばされるため、
たとえ HasFieldsEnclosedInQuotes = true / TrimWhiteSpace = false を
指定したいたとしても、ReadFields メソッドで順次読み込みする限り
 var lines = new string[4][];
 lines[0] = new string[2] { "BARCODE", "NAME" };
 lines[1] = new string[2] { "4901313037508", "ソフトサラダ" };
 lines[2] = new string[2] { "4582409181895", "選べる!\r\nみんなのスープ\r\n8袋入" }; // ★破損行
 lines[3] = new string[2] { "4901990328544", "ごつ盛 坦々麺" };
のように解釈されてしまうことになります。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[1]: C# csvファイル読み込みの質問です /WebSurfer 返信無し
 
上記関連ツリー

C# csvファイル読み込みの質問です / 普通のサラリーマン (18/01/12(Fri) 20:00) #86281
Re[1]: C# csvファイル読み込みの質問です / 魔界の仮面弁士 (18/01/12(Fri) 22:06) #86283
Re[1]: C# csvファイル読み込みの質問です / WebSurfer (18/01/13(Sat) 12:53) #86284
│└ C# csvファイル読み込みの質問です / 魔界の仮面弁士 (18/01/13(Sat) 15:47) #86286 ←Now
Re[1]: C# csvファイル読み込みの質問です / 魔界の仮面弁士 (18/01/13(Sat) 17:03) #86287

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信