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

わんくま同盟

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

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

■86283 / 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 列になってしまいますよね。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←C# csvファイル読み込みの質問です /普通のサラリーマン 返信無し
 
上記関連ツリー

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

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