これはstackoverflowのどこにも見つからないようです。
ファイルがあり、それがパイプ (|) またはカンマ (,) で区切られているかどうかを調べたいと考えています。また、テキスト修飾子が quote(") であるか、何もないかを確認したいと思います。これを行う C# 関数を持っている人はいますか?ありがとう!
これは私の頭の中で、ファイルに同じ数の列があり、可能な区切り文字である文字のリストがあると仮定しています。
char[] delims = { '|', ',', ... };
行のサブセット、または十分に小さい場合はファイル全体を取得し、それらを文字列配列に格納します。
string[] lines = text.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
区切り記号をループし、その区切り記号を使用して分割エントリの数を int の配列に挿入します。
int[] counts = lines.Select(s => s.Split(currentDelimiter).Length).ToArray();
独自の方法を使用して、すべてのカウントが互いに等しく、すべて 1 より大きいことを確認します。使用する区切り記号は、使用する区切り記号です。
このようなテキスト区切りのファイルでは、TextFieldParserが非常に便利なツールであることがわかりました。(Visual Basic dll をインポートして、C# アプリで使用できます)。
あなたによると、ファイルごとに固定数の列があるため、私が使用する一般的な戦略は、区切り文字を選択し、1 行の列数が前の行と異なるまで行の解析/読み取りを続けることです。その場合は、他の区切り文字に切り替えます (両方が無効な場合はどうすればよいかわかりません)。最初の行に区切り文字がまったく見つからない場合は、区切り文字も破棄することをお勧めします。HasFieldEnclosedInQuotesを true に設定して使用するTextFieldParser
と、引用符でエスケープされたフィールドを適切に処理できます (引用符が使用されていない場合でも問題なく機能します)。これは、通常の文字列操作を使用して引用符を手動で処理するよりもはるかに簡単です。
最初の行 (最初の行がファイル名のヘッダーの場合は 2 行目) を取得します。
次に、正規表現を使用して可能な形式を確認できます。すなわち
Regex rePipesAndQualifier = ("[^|"]*"|);
rePipesAndQualifier.match(yourFileLine);
空でない一致がいくつか返される場合は、区切り記号としてパイプを使用し、区切り記号があることがわかります。
カンマ区切りと修飾子の有無をチェックする正規表現をさらに作成します。
それはあなたが期待するもの(すべて区切られている、文字列のみが区切られている)とあなたが知っていること(デリミタは最初と最後、または真ん中だけ、フィールドの数など)に少し依存します。そのため、正確な解決策を提供することはできません。