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

わんくま同盟

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

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


■86283 / )  Re[1]: C# csvファイル読み込みの質問です
□投稿者/ 魔界の仮面弁士 (1530回)-(2018/01/12(Fri) 22:06:46)
No86281 (普通のサラリーマン さん) に返信
> 複数行、複数列のセルに数値が入力されているcsvファイルがあります。

改行が「各レコードの末尾」に付与された CSV ファイルを生成する処理系と
string strStream = "111,222,333\r\n444,555,666\r\n777,888,999\r\n";

改行が「レコードとレコードの間」に付与される CSV ファイルを生成する処理系があります。
string strStream = "111,222,333\r\n444,555,666\r\n777,888,999";


今回の場合、データとして「空欄」があるとのことですので、
上記のどちらの仕様で進めるのかも、事前に確認しておいてください。

というのも、1 列のみで構成された
 string strStream = "111\r\n";
という CSV ファイルがあった場合、
前者(行末に改行)ルールでは 1 レコードのファイルと判定されねばなりませんし、
後者(行間で改行)ルールでは 2 レコードのファイルと判定されねばならないわけです(2行目は空欄)。



> System.StringSplitOptions option1 = StringSplitOptions.RemoveEmptyEntries;
> string[] lines1 = strStream.Split(new char[] { '\r', '\n' }, option1);

空欄が許容されているのですから、RemoveEmptyEntries を指定してはマズイです。

今回は、「空」であることも重要な情報なのですから、
StringSplitOptions は None のままにしておくべきかと思いますよ。


ここでは仮に、「行と行の間で改行」する CSV ルールであると仮定し、
下記のような「4行1列」の CSV があったとしてみましょう。

2 行目に空欄のデータがあります。
 string strStream = "111\r\n\r\n333\r\n444";

この場合、Split 処理を
 string[] lines1 = strStream.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
 string[] lines2 = strStream.Split(new char[] { '\r', '\n' }, StringSplitOptions.None);
 string[] lines3 = strStream.Split(new string[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
としてみるとどうなるでしょうか。

lines3 なら、正しく 4 行に分解してくれますが、
lines1 だと、空行が削除されて 3 行になってしまいます。
lines2 に至っては、\r と \n の間でも区切ってしまい、7 行扱いですね。



ここまでは行単位に区切る場合の話をしてきましたが、
もちろん、列方向に区切る場合も同様です。

RemoveEmptyEntries を指定してしまうと、
"111,,333" が 3 列ではなく、2 列になってしまいますよね。
返信 編集キー/


管理者用

- Child Tree -