CSV が「文字区切り値」を意味するように再定義された場合、ファイルが実際に CSV であることを自動検出する信頼できる方法は何でしょう。?
本質的に、この (再) 定義では、CSV = DSV ("区切り記号で区切られた値") が、たとえばこのウィキペディアの記事で説明されていますが、"カンマで区切られた値" 形式はRFC 4180で定義されています。
より具体的には、データが何らかの形で「固定」長さ、つまり「可能なCSV」であることを統計的に控除する方法はありますか? 区切り文字の数を数えるだけでは、レコードごとに可変数のフィールドを持つ CSV ファイルがあるため、常に機能するとは限りません(つまり、RFC 4180 の義務とは反対に、同じファイル全体で同じ数のフィールドを持たないレコード)。
CSV の認識は、特にファイル拡張子に基づいて検出できない場合 (たとえば、そのような情報を持たないストリームを読み取る場合)、特に困難な問題のようです。
適切な (「完全な」)自動検出を確実に行うには、少なくとも 4 つの決定が必要です。
- ファイルが実際に CSV であることの検出
- ヘッダーの存在の検出
- 実際の区切り文字の検出
- 特殊文字 (引用符など) の検出
特に可変長レコード、一重引用符または二重引用符で囲まれたフィールド、または複数行のレコードなどのコーナー ケースでは、他のデータセット (コンマを使用するフリー テキストなど) と類似しているため、完全な自動検出には単一のソリューションはないようです。
そのため、CSV 検出ルールを適用する前に、CSV としても分類できる形式 (たとえば、Apache CLF のようなログ ファイル形式) を検査するテレスコピック検出が最善のアプローチのようです。
Excel のような商用アプリケーションでさえ、(1) を決定するためにファイル拡張子 (.csv) に依存しているように見えますが、これは明らかに自動検出ではありませんが、データが CSV であるとアプリケーションに通知されれば問題は大幅に単純化されます。
(2) と (3) のヒューリスティックについて説明している関連記事を次に示します。
引用符のタイプである (4) の検出は、ファイルから数行を処理し、対応する値を探すことに基づいています (たとえば、行ごとに偶数の ' または " は、一重引用符または二重引用符を意味します)。これは、CSV の行分離 (複数行イベントなど) を適切に処理する既存の CSV パーサー ( OpenCSV など)を初期化することで実行できます。
しかし、(1)、つまりそもそもデータが CSV であると判断する場合はどうでしょうか。
データ マイニングはこの決定に役立つでしょうか?