0

一貫性のない引用符 (CsvToOtherDelimiter オプション) を含む CSV ファイルの SQL Server 一括挿入を基礎として使用したところ、RemoveCSVQuotes 部分にいくつかの奇妙な点が見つかりました [コンマを含む引用符で囲まれた文字列から最後の文字が切り取られました!]。だから..そのビットを書き直した(多分間違い?)

しわの 1 つは、クライアントが「このようなデータはどうですか?」と尋ねたことです。

""17.5179C,""

CsvToOtherDelimiter ソリューションを使い続けたい場合は、RegExp を修正する必要があると思います...しかし、それは私を超えています...最善のアプローチは何ですか?

明確にするために、フォーマット ファイルを使用して一括挿入を実行する前に、C# を使用してファイルをパイプ区切り形式に前処理しています。スピードはかなり重要です。

4

3 に答える 3

0

CSV 文字列を要素のリストに変換するには、一度に 1 文字ずつ文字列を処理し、見つかった要素を出力する際に​​ (引用符内または引用符外で) 状態を追跡するプログラムを作成できます。CSV での引用の規則は変なので、十分なテスト データがあることを確認する必要があります。

ステート マシンは次のようになります。

  1. 引用符 (2 に進む) またはコンマ (3 に進む) までスキャンします。
  2. 次の文字が引用符である場合は、2 つの引用符のうちの 1 つだけをフィールドに追加して 1 に戻ります。それ以外の場合は、4 に進みます (または、引用符がフィールドの最初の文字でない場合はエラーを報告します)。
  3. フィールドを放出し、1 へ
  4. 引用までスキャンする (5 へ)
  5. 次の文字が引用符の場合は、2 つの引用符のうちの 1 つだけをフィールドに追加して 4 に戻ります。それ以外の場合は、フィールドを出力し、コンマをスキャンして 1 に進みます。

これにより、次のようなものが正しくスキャンされます。

  • こんにちは、世界、123、456
  • 「こんにちは世界」、123、456
  • 「彼は「こんにちは、世界!」と言いました」「そして私はこんにちはと言いました」
  • ""17.5179C,"" (引用符で囲まれた最初の文字列 "" と 2 番目のフィールド 17.5179C の間に区切り文字が必要であるため、エラーを正しく報告します)。

別の方法は、それをうまく行う既存のライブラリを見つけることです。確かに、CSV は、そのようなものが存在しなければならないほど一般的ですか?

編集:

あなたは速度が重要であると述べたので、(引用符で囲まれた文字列に改行を含めることが許可されていない限り...) 各行は独立して並行して処理される可能性があることを指摘したかったのです。

于 2013-03-26T16:22:38.613 に答える
0

リンクからの受け入れられた回答は次で始まります。

ファイルを前処理する必要があります。

csv を xml に変換してみませんか? 次に、データベースに保存する前に、xsd に対してデータを検証できます。

于 2013-03-26T16:25:56.593 に答える
0

私は、私たちがすでに持っているとは知らなかった csv パーサーを使用することになりました (コード生成ツールの一部として提供されます)。

于 2013-03-27T15:15:29.497 に答える