|
■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 列になってしまいますよね。
|