0


0

タブ区切りファイルでの引用

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

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

そして、それはすべてうまく機能しています!

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

_ 「すみせい丸の2」-日本海 _

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

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

そして、その「生データ」では、クレーム記述フィールドに引用符付きのデータが十分に表示されていることを確認してください。

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

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

任意の助けは大歓迎です!

乾杯、ショーン

7 Answer


2


代わりにhttp://www.filehelpers.com/[FileHelpers]ライブラリを使用してください。 広く使用されており、引用フィールド、または引用を含むフィールドに対応します。


2


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

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


1


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

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();
            }
        }
    }


0


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


0


アプリケーションでファイルを開き、各引用符を別の文字に置き換えて処理することができます。


0


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

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

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

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

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

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

このような状況は、ツールセットへのソースコードアクセスが不可欠である理由です。

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


0


右-深夜のレッドブルと私の頭の傷の後、私は最終的に問題を見つけました、それは「Claim_Description」フィールドのコンマでした。 私はタブ区切りファイルを使用していたので、それについて考えることさえしませんでしたが、ファイル内のすべてのコンマを見つけて置換するとすぐに、それは完全にうまくいきました!

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

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

乾杯、ショーン