質問
私は、タブ区切りのテキストファイルを開き、データベースにそのデータを挿入する簡単なアプリケーションを持っています。
私は、データを読み取るために、このCSVリーダーを使用しています:のhttp:// WWW .codeproject.com / KB /データベース/ CsvReader.aspxする
そして、それがすべてうまく働いている!
今私のクライアントは、「ClaimDescription」であるファイルの末尾に新しいフィールドを追加しました、そしてこれらの請求記述の一部では、データがそれに引用符があり、たとえばます:
"SUMISEI MARU NO 2" - 日本の海
これは私のアプリのための主要な頭痛を引き起こしているようです。私はこのようになります例外を取得します:
CSVレコード「181」の位置に「1470」フィールド'26近く壊れて表示されます。現在の生データ:...
そして、その「生データ」で、確かに請求記述フィールドは、その中に引用符を使用してデータを示しています。
私は、誰もがこれまでこの問題を抱えていたし、それの周りに持っているかどうかを知りたいですか? もちろん、私は彼らがもともと私に送ってデータを変更するには、クライアントを求めることができますが、これは、彼らがタブ区切りファイルを生成するために使用する自動化されたプロセスです。そして、私はむしろ、最後の手段としてこれを使用すると思います。
私は多分、手の前に標準たTextReaderを使用してファイルを開く任意の引用符をエスケープし、戻って新しいファイルに内容を書くことができ考えていた、その後、CSVリーダーにそのファイルを養います。これらのタブ区切りファイルの平均ファイルサイズが40メガバイトの周りにあることを、おそらく言及する価値がある。
すべてのヘルプは大歓迎です!
乾杯、ショーン
解決 7
右 - レッドブルと頭を掻くの深夜の後、私は最終的には「Claim_Description」フィールドにカンマた、問題を発見しました。でも、すぐに私は、それは絶対にうまく働いたファイル内で検索し、すべてのコンマに置き換えたとして、私はタブ区切りファイルを使用していたので、それについて考えるが、いませんでした!
次のステップは、処理の前に、これらのカンマを交換する方法を見つけることです。
ここでも、すべての提案に感謝します。
乾杯、ショーン
他のヒント
引用符についてCodeProjectの記事にコメントをチェックします:
のhttp://www.codeproject .COM /メッセージ/ 3382857 /再引用-内部の - Field.aspx の
あなたが引用符として使用されるように、「ほかに別の文字が欲しいコンストラクタで指定する必要があります。
の代わりに FileHelpers のライブラリを使用してください。それは、広く使用されており、引用されたフィールド、または引用符を含むフィールドにも対応します。
私は最近、同様の問題を解決し、そして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();
}
}
}
たぶん、あなたはあなたのアプリケーションでファイルを開くと、別の文字で、各引用符を交換し、それを処理することができます。
( RFC 4180 の)私はいくつかの検索を行なったし、CSVファイル用のRFCがあります、それは明示的に、彼らがやっていることを禁止ん:
各フィールドは、またはしかし、(二重引用符で囲まれていてもいなくてもよいです Microsoft Excelなどの一部のプログラムは、二重引用符を使用しません まったく)。フィールドは二重引用符で囲まれていない場合は、 二重引用符は、フィールド内に表示されないことがあります。
Basicly、彼らは、彼らがそうのように、引用符でそのフィールド全体を囲む必要があることを行いたい場合:
,""SUMISEI MARU NO 2" - sea of Japan",
あなたがそれらに戻って、この問題を投げることができますしたいと主張している場合、彼らはあなたに「適切な」RFC 4180のCSVファイルを送信するようにします。
あなたがそのCSVリーダーのためのソースファイルへのアクセス権を持っているので、、別のオプションは、彼らはあなたを供給している引用符で囲まれた文字列の種類を処理するためにそれを変更することです。
あなたのツールセットにソースコードへのアクセスを持っていることが重要である理由この種の状況が正確である。
代わりに、あなたのツールにそれらをfeeing前に前処理(ハック)自分のファイルしたい場合は、、正しい方法では、セパレータの前または後ろにいない、すぐに見積もりを持つフィールドを探すためにも、そしてそのフィールド全体を囲みます引用符の別のセットインチ