0

タブ区切りのテキスト ファイルを開き、そのデータをデータベースに挿入する単純なアプリケーションを作成しました。

この CSV リーダーを使用してデータを読み取っています: http://www.codeproject.com/KB/database/CsvReader.aspx

そして、それはすべて正常に機能しています!

今、私のクライアントはファイルの最後に新しいフィールド「ClaimDescription」を追加しました。これらのクレームの説明の一部では、データに引用符が含まれています。例:

「第二住生活丸」 - 日本海

これは私のアプリにとって大きな頭痛の種になっているようです。次のような例外が発生します。

CSV は、位置「181」のレコード「1470」フィールド「26」付近で破損しているようです。現在の生データ: ...

そして、その「生データ」では、クレームの説明フィールドに引用符付きのデータが表示されます。

誰かが以前にこの問題を抱えていて、それを回避したことがあるかどうか知りたいですか? もちろん、最初に送信されたデータを変更するようクライアントに依頼することもできますが、これはクライアントがタブ区切りファイルを生成するために使用する自動化されたプロセスです。そして、私はむしろそれを最後の手段として使用したいと思います.

事前に標準の TextReader を使用してファイルを開き、引用符をエスケープし、コンテンツを新しいファイルに書き戻してから、そのファイルを CSV リーダーにフィードできると考えていました。これらのタブ区切りファイルの平均ファイル サイズが約 40MB であることは、おそらく言及する価値があります。

どんな助けでも大歓迎です!

乾杯、ショーン

4

7 に答える 7

2

引用符に関する codeproject 記事のコメントを確認してください。

http://www.codeproject.com/Messages/3382857/Re-Quotes-inside-of-the-Field.aspx

コンストラクターで、" 以外の別の文字を引用符として使用するように指定する必要があります。

于 2010-03-11T14:47:57.193 に答える
1

私は最近同様の問題を解決しました。CsvReaderはTSVファイルの数行を除いてすべて正常に機能していましたが、最終的に問題を解決したのcustomDelimiterは、のコンストラクターにを設定することでした。CsvReader

public static void ParseTSV(string filepath)
    {
        using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t')) {
        //if that didn't work, passing unlikely characters into the other params might help
        //using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t', '~', '`', '~', ValueTrimmingOptions.None)) {
            int fieldcount = csvReader.FieldCount;

            //Does not work, since it's read only property
            //csvReader.Delimiter = "\t";

            string[] headers = csvReader.GetFieldHeaders();

            while (csvReader.ReadNextRecord()) {
                for (int i = 0; i < fieldcount; i++) {
                    string msg = String.Format("{0}\r{1};", headers[i],
                                               csvReader[i]);
                    Console.Write(msg);
                }
                Console.WriteLine();
            }
        }
    }
于 2013-01-07T17:28:28.977 に答える
1

代わりにFileHelpersライブラリを使用してください。これは広く使用されており、引用符で囲まれたフィールドや引用符を含むフィールドに対応します。

于 2010-03-11T14:43:06.190 に答える
0

右 - レッドブルの深夜と私の頭を引っ掻いた後、私は最終的に問題を発見しました.それは「Claim_Description」フィールドのカンマでした. タブ区切りのファイルを使用していたので、それについては考えもしませんでしたが、ファイル内のすべてのコンマを検索して置換するとすぐに、まったく問題なく動作しました!

次のステップは、処理前にこれらのカンマを置き換える方法を見つけることです。

繰り返しますが、すべての提案に感謝します。

乾杯、ショーン

于 2010-03-12T10:25:48.713 に答える
0

OleDbConnection を使用 http://social.msdn.microsoft.com/Forums/en/winformsdatacontrols/thread/98fce7d7-b02d-4027-ad2e-2df3a28bd439

于 2010-03-11T14:44:57.653 に答える
0

おそらく、アプリケーションでファイルを開き、各引用符を別の文字に置き換えてから処理できます。

于 2010-03-11T14:49:12.107 に答える
0

私はいくつかの検索を行いました.CSVファイルのRFC(RFC 4180)があり、それは彼らがしていることを明示的に禁止しています:

各フィールドは、二重引用符で囲まれている場合と囲まれていない場合があります (ただし、Microsoft Excel などの一部のプログラムでは、二重引用符がまったく使用されません)。フィールドが二重引用符で囲まれていない場合、フィールド内に二重引用符が表示されないことがあります。

基本的に、そうしたい場合は、次のようにフィールド全体を引用符で囲む必要があります。

,""SUMISEI MARU NO 2" - sea of Japan",

したがって、必要に応じて、この問題を彼らに投げ返し、「適切な」RFC 4180 CSV ファイルを送信するように主張することができます。

そのCSVリーダーのソースファイルにアクセスできるので、別のオプションは、それを変更して、供給されている引用符で囲まれた文字列の種類を処理することです.

この種の状況こそが、ツールセットにソース コードからアクセスできることが不可欠な理由です。

代わりに、ファイルをツールに渡す前に前処理 (ハッキング) したい場合、正しい方法は、引用符が区切り記号の直前または直後ではないフィールドを探し、そのフィールド全体を別のセットで囲むことです。引用符の。

于 2010-03-11T14:56:22.560 に答える