|  | > 今はA Fast CSV Reader を使い読み込ませているのですが、 ざっと見てみましたが、コメント行入り CSV にも対応した実装に
 なっていますね。ソースも公開されているようで。
 
 CSV 仕様にもよりますが、たとえばこんな感じでどうでしょう。
 
 // CsvReader version 3.9.1.0
 using (var csv = new LumenWorks.Framework.IO.Csv.CsvReader(file, true)) {
 bool hasError = false;
 csv.MissingFieldAction = LumenWorks.Framework.IO.Csv.MissingFieldAction.ReplaceByNull;
 csv.ParseError += delegate { hasError = true; }; // 列数オーバー等
 int fieldCount = csv.FieldCount;
 string[] cols = new string[fieldCount + 1];
 while (csv.ReadNextRecord() && !hasError) {
 csv.CopyCurrentRecordTo(cols);
 if(Array.IndexOf(cols, null) != fieldCount) {
 return -1; // 列数不足
 }
 }
 return hasError ? -1 : fieldCount;
 }
 
 
 > 最終的にはヘッダーの数とデータの数が不一致の場合は-1を返すよう考えています。
 先頭行を常にヘッダーとみなす実装にするのでしょうか。
 それとも、ヘッダーの有無を引数で指定するのでしょうか。
 
 GetColumns メソッドに用意した hasHeader という
 引数が使われている様子が無いですし、かといって
 CsvReader の hasHeaders 引数は false 固定に
 なっているようで。
 
 
 > 読込するCSVファイルは以下の前提条件があります。
 CSV ファイルは、
 (1) レコードの末尾に改行を伴うもの
 (2) レコードとレコードの間に改行を伴うもの
 とがありますね。
 
 前者は「aaa,bbb,ccc\r\nxxx,yyy,zzz\r\n」形式で
 後者は「aaa,bbb,ccc\r\nxxx,yyy,zzz」形式です。
 
 
 後者の前提で前者のCSVを受け取ってしまうと、
 最後の改行の後に列数1の空文字列があるように
 見えてしまいます。
 
 かといって「空の行」を読み飛ばす仕様だと、
 末尾行以外に空行を含むデータがあった時に
 「データの数が不一致の場合は-1を返す仕様」を
 満たせなくなってしまう可能性が生じます。
 
 
 > 2.ダブルコーテーションは付ける場合と付けない場合がある
 > 5.データの中にカンマと改行を使う可能性がある
 「ダブルコーテーションを含んだデータ」はどのような CSV にする予定でしょうか?
 たとえば『ab"cd』というデータを含めるようなケースです。
 
 また、『「xyz」なデータと「"xyz"」なデータを区別する』必要が
 ある場合に、どのような CSV を求めるのかも重要です。
 
 その上で、ダブルコーテーションの対応が不適切な CSV データが
 渡されてきた場合に、列数として何を return させるのか(-2 とか 0 とか)
 あるいは何らかの例外を throw させるのかも考えておく必要がありそうです。
 
 
 > 3.文字コードはUTF-8かSJISかは引数で渡す
 改行コードにもご注意下さい。Shift_JIS だと CrLf 改行が多いですが、
 UTF-8 の場合、CrLf だけでなく Lf 改行なデータもしばしば見かけます。
 
 ちなみに Excel で生成されるデータの場合、
 レコード間の区切りは CrLf ですが
 セル内改行は Lf になりますね。
 
 
 > 4.列数と行数は不定
 その上で、「行によって列数の異なる CSV」が渡された場合は、
 戻り値として -1 を返せば良いのですね。
 
 
 > 6.データはNull(空白)もある
 これは '\0' な文字が含まれるという意味でしょうか。
 // Char nullChar = default(Char);
 
 それとも、「col1,col2,,col4」のように、
 空のフィールドが存在するという意味でしょうか。
 
 
 > CSVを1行毎に配列へ格納する手段はないでしょうか。
 提示されたコードだと、変数 vlist のスコープが間違っていませんか?
 
 |