■86286 |
Re[2]: C# csvファイル読み込みの質問です |
□投稿者/ 魔界の仮面弁士 -(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", "ごつ盛 坦々麺" }; のように解釈されてしまうことになります。 |
|