1

postgresデータベースにロードする必要のあるデータを含むテキストファイルが提供されています。

ファイルは、チルダ(〜)で区切られたフィールドを持つレコード(1行に1つ)で構造化されています。残念ながら、フィールドコンテンツにチルダが含まれることがあります。

ファイルは整理されたCSVでなく、チルダはエスケープされないため、レコードに含まれるフィールドが多すぎて、データベースが例外をスローし、ロードを停止します。

レコードがどのように表示されるかを知っています(テキスト、整数、浮動小数点フィールド)。

誰かが長すぎるレコードを修正する方法についての提案がありますか?私はperでコーディングしていますが、python、javascript、プレーン英語での提案に満足しています。

4

2 に答える 2

1

次のような方法で、破損した行を除外することができます。

perl -F'~' -lane 'print if @F > 10' input.txt > broken_fields.txt 

(フィールドの最大数が 10 であると仮定します)。おそらく手動で検査できる疑わしい行を含む短い(より)ファイルが提供されます。これは絶対確実なフィルターではありません。たとえば、引用符で囲まれた文字列内のチルダなど、許可されたフィールドを出力します。より正確なものが必要な場合は、を使用できますがText::CSV、破損した csv データに関しては別の問題が発生します。

これを解決するためのより良い (そして自動的な) 方法があるかもしれませんが、入力がどのように見えるかを知らなければ、実際に何かを推奨する方法はありません。

于 2012-09-23T18:02:20.583 に答える
0

各フィールドが何であるかがわかっている場合は、そのフィールドタイプのみに一致する正規表現を記述し(チルダを無視)、一致をキャプチャしてから、ファイル内の元の文字列を置き換えることができますか?

于 2012-09-23T14:37:59.300 に答える