|
> 今は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 のスコープが間違っていませんか?
|