COPY
명령을 사용하여 CSV 파일에서 Postgres 12 데이터베이스를 채우려 고 몇 시간 동안 노력해 왔습니다 . 문제의 테이블에는 hstore
필드가 있고 키-값 쌍 중 하나의 값에 큰 따옴표 "
가 있습니다.
Postgres 데이터베이스는 다음과 같이 생성됩니다.
CREATE TABLE test (
title VARCHAR(20),
tags hstore
);
CSV 파일은 tabs
구분자로 사용 되며 다음과 같습니다.
My Title | name=>"""Paul "Butch" Newman""", job=>actor
이름 값은 공백을 포함하므로 큰 따옴표로 묶고 이스케이프해야합니다.
|
하나의 탭 문자를 나타냅니다.
내 수입 명세서는 다음과 같습니다.
COPY test (title, tags)
FROM '/var/lib/postgresql/data/test.csv'
DELIMITER E'\t' CSV ENCODING 'UTF8';
데이터베이스가 예상대로 채워지지만 쿼리 할 때
SELECT tags->'name' as name FROM test;
pgAdmin 4 반환
Paul Butch Newman
대신에
Paul "Butch" Newman
내 질문은 실제 hstore 값에 큰 따옴표를 얻는 방법입니다.
텍스트 필드로 가져올 때 큰 따옴표에 대한 많은 답변을 찾았습니다. 그러나 여기서 가져 오기는 hstore
필드 로 가져오고 값은 공백을 포함하므로 여기에서 큰 따옴표로 묶어야합니다.
감사!
방금 이걸 현지에서 연주했습니다.
입력 파일의 형식을 제어 할 수 있다고 가정합니다.
문제는 CSV 형식 ""
이 큰 따옴표로 묶인 요소 내에서 발견 된 요소를 "
전달할 때로 변환한다는 것입니다.
이것은 내가 원하는 결과를 얻는 데 도움이되었습니다.
My Title | name=>"""Paul \""Butch\"" Newman""", job=>actor
CSV 핸들러가 큰 따옴표를 작은 따옴표로 바꾸어 이스케이프 처리를 완료하면으로 전달 name=>"Paul \"Butch\" Newman", job=>actor
됩니다. insert
이는 psql 또는 PgAdmin에서 리터럴로 작성하는 방법입니다.
select tags->'name' as name
from test_hstor;
name
---------------------
Paul "Butch" Newman
(1 row)
호기심 때문에 csv 대신 텍스트로 가져 오는지 확인했으며 입력 레코드가 name=>"Paul \\"Butch\\" Newman", job=>actor
제대로 작동 하려면 포함 해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다