2013-12-05 1 views
7

탭으로 구분 된 CSV 파일의 경우 이 아니며은 따옴표로 묶여 있습니다. 여기서 필드 데이터에는 작은 따옴표, 큰 따옴표, 파이프 및 백 슬래시와 같은 문자가 포함될 수 있습니다.Postgres COPY 명령에서 CSV 형식으로 따옴표 처리를 해제 할 수 있습니까?

샘플 데이터는 다음과 같이 할 수 있습니다

1  2  "ba$aR\eR\  18 

내가 COPY 문을 사용하여 포스트 그레스에이 데이터를 가져올.

내가 대신 필드 분리 뒤에 백 슬래시 "탭을 탈출"로 포스트 그레스는 백 슬래시 + 탭을 취급하고 있기 때문에 오류 psql:-:1: ERROR: missing data for column를 얻을 수

COPY <tablename> FROM <filename> NULL AS ''; 

사용이 가져올

.

그래서 나는 COPY 연산자의 "CSV 형식"을 사용하여 전환과 같이 :

COPY <tablename> FROM <filename> WITH CSV DELIMITER E'\t' NULL AS ''; 

지금 psql:-:1: ERROR: value too long for type character varying(254)

분명히 새로운 오류에게있어 그것은 시작에 큰 따옴표를 해석 때문에 필드 래핑 문자로 필드 3의.

내 데이터가 이 아니고이 전혀 지정되지 않도록 지정하려면 어떻게해야합니까?

+1

왜 답변으로 당신의 해결 방법을 게시하지 : COPY 이후

, 당신은 tr의 출력을 파이프로 I/O에 미치는 영향을 완화 할 수 STDIN에서 읽기 지원? –

+1

팁 주셔서 감사합니다! –

+0

[PostgreSQL로 CSV 파일을 가져올 때 인용 부호 무시?] (http://stackoverflow.com/questions/7376322/ignore-quotions-marks-when-importing-a-csv-file-into-postgresql) –

답변

18

해결 방법 (this comment 덕분에!)

COPY <tablename> FROM <filename> WITH CSV DELIMITER E'\t' QUOTE E'\b' NULL AS ''; 

그래서 기본적으로 텍스트 않을 것입니다 견적 문자를 지정하지만 꽤 추한.

실제로 인용 처리를 모두 끄는 방법이 있다면 나는 그것을 선호합니다. 당신이 \b을 제거 tr을 사용할 수 있습니다

기록을 위해, 내가 같은 문제로 고전을 면치 못하고 한 이후 (내가 언급. 아직 명성을 가지고 있지 않기 때문에 새 응답으로 추가)

0

, 단지 대신에을 원하기 때문에 텍스트가 어디에도 없습니다.

tr -d '\010' <filename.csv> newfile.csv 

( \010\b octal representation의 것을 사용).

cat filename.csv | tr -d '\010' | COPY <tablename> FROM STDIN WITH CSV DELIMITER E'\t' QUOTE E'\b' NULL AS ''; 
관련 문제