1

おそらく7列であると思われるCSVファイルを取得しましたが、最近までうまくいっていました.3番目のデータ列内でカンマを使用し始め、3番目の列内でもCRおよびLF文字を使用し始めました。これらはすべて二重引用符で囲まれています.

行ごとに読んでいたので、別のファイルとクロスチェックして、別のファイルの正しい行を指すことができましたが、改行コードとコンマが含まれているため、コードが台無しになっています.

例えば:

  1. 1,4778,"El murciélago estaba navegando",10/08/2010,906610,13496-86219-1,1. これは問題なく動作します。

  2. 1,4778,"El murciélago estaba navegando,
    y además estaba de parranda",10/08/2010,906610,13496-86219-1,1
    . これはまずい

これを解決するために提案する方法はありますか?3 番目のデータ列は常に、これらの突然の変化を伴う列です。他の人は新しい行や追加のカンマを扱うことは決してないので、それらをフィルタリングする必要はありません...

前もって感謝します!

4

2 に答える 2

3

おそらく、これを処理するための最もクリーンで体系的な方法は、1 文字ずつ読み取り、小さなステート マシンを使用して、「引用符で囲まれた文字列の内部にいるため、コンマ、CR、LF は無視する」などの処理を行うことです。

これを行う 1 つの方法は、各行が現在の状態であり、各列が可能な入力文字である配列を作成することです。入力文字を読み取り、現在の状態と入力文字に基づいて、次に入力する状態を取得します。通常、現在の状態と次の状態に基づいてアクションを実行するための case ステートメントもあります (たとえば、CurrentField読み取ったものがフィールドの一部として許可されている場合に、現在の文字を文字列に追加する)、または現在の状態を保存します。フィールドの終わりに到達したときのフィールド文字列。

したがって、Start 状態から開始します。Start 状態で引用符が表示されると、QuotedField 状態に移行します。文字または数字が表示された場合は、UnQuotedField 状態になります。コンマが表示された場合は、EndField 状態に移動します (つまり、空のフィールドを読み取っただけです)。他の多くのものが表示される場合は、エラー状態に移行します。

QuotedField 状態では、引用以外はすべて受け入れられ、QuotedField 状態のままになります。引用符が表示された場合は、次の文字が引用符 (二重引用符はフィールドに埋め込まれた引用符に変換されます) なのか、それとも別の文字 (引用符がフィールドの終わりを示している) なのかを確認する必要があります。次の入力文字を覗いて引用符であるかどうかを確認するコードを手で書くか、引用符を取得した場合に QuotedField 状態に戻る別の状態、EndField 状態をエンコードすることで、これを行うことができます。カンマが見つかった場合、またはその他のほとんどのもの (文字や数字など) のエラー状態。

于 2010-08-12T22:18:12.037 に答える
1

ほとんど知られていませんが、BDE は CSV ファイルを読み取ることができます。必要なのは、ファイルの形式を伝える定義ファイルだけです。使用方法は BDE ドキュメントに記載されています。

于 2010-08-16T08:17:00.927 に答える