0

以下を実行して、bash で CSV ファイルのコレクションを反復処理します。

iconv --from-code=ISO-8859-1 --to-code=UTF-8 ${FILE} | \
    sed -e 's/\"//g' | \
    sed -e 's/, /,/g' \
    > ${FILE}.utf8

iconvUTF-8 文字を修正するために実行すると、最初のsed呼び出しで二重引用符が削除され、最後のsed呼び出しでコンマの前後の空白が削除されるはずです。

ただし、保存したファイルにはまだ次のような行があります。

FALSE,,,, 2.40,,

postgresのCOPYコマンドはちょっとばかげているので、" 2.40" は数値の有効な構文ではないと考えます。

CSV ファイルの処理でどこが間違っていますか? ありがとう!

4

4 に答える 4

0

2つ目sedは、末尾のスペースのみを削除します(実際、末尾のスペースは1つだけです)。ここで先頭のスペースを削除することになっているのは何ですか?

于 2012-04-14T23:23:23.687 に答える
0

スペースを削除するには、次のいずれかを作成します。

sed -e ':a; s/, /,/g; ta'
sed -e 's/,[ ][ ]*/,/g'

最初のものは、一致する組み合わせが見つからなくなるまで再帰的に更新を実行します。2 つ目は、スペースを検索し、その後に可能なスペースのグループを検索します。

"デフォルトではPostgreSQLは使用時にそれらを理解するため、削除する必要はありませんCOPY ... WITH (FORMAT CSV)

于 2012-04-15T05:34:13.333 に答える
0

データ型に正確に適合するように CSV を準備する一般的な代替手段textは、すべてのデータを(列を含む一時テーブルにtext) インポートし、PostgreSQL の型強制メカニズムに一部の作業を自動的に行わせることです。

text特に、 a が数値型または日付/時刻型にキャストされると、先頭と末尾の空白が自動的に削除されます。試す:

SELECT '   234 '::text::int;
SELECT '    23.4 '::text::float8; -- incl. a leading tab
SELECT '    2012-12-1    '::text::date; -- incl. a leading & trailing tab

したがって、次のようなテーブルがある場合:

CREATE TABLE foo
( id    integer,
  col_a date,
  col_b double precision
);

あなたはできる:

CREATE TEMP TABLE foo_tmp  -- dropped automatically at end of session
( id    text,
  col_a text,
  col_b text
);
COPY foo_tmp FROM '/path/to/foo_file.csv';
INSERT INTO foo
SELECT id::int
      ,col_a::date
      ,col_b::double precision
FROM   foo_tmp;

または、必要に応じて他の Postgres 関数を使用して文字列を準備します。

必要なのは有効な CSV 形式だけです。

于 2012-04-17T11:23:51.483 に答える