Postgres에서 Copy를 이용한 csv파일 로드 함수 0 1 943

by 김선우 [DB 기타] [2017.08.23 19:19:50]


안녕하세요

csv파일을 대상으로 테이블에 로드하려고 합니다.

csv안의 데이타에는 더블쿼트로 둘러쌓여 있는 데이타도 존재하기에 에러가 납니다.

여러가지 방법으로 시도해 봤지만 않되기에 여기까지 왔습니다.

입력데이타는 다음과 같습니다.

------------------------

123,aaa,1q2w3e,1234er        -> 정상 입력 레코드

234,"bb,cc",1q2345,345re2    -> 문제의 데이타 레코드

------------------------

CREATE OR REPLACE FUNCTION load_users(IN in_fp text, IN in_ecd text)
RETURNS integer AS $$
DECLARE
    icnt varchar(100);

    var_str varchar(1000);
BEGIN
      --임시테이블작성
    CREATE TABLE tmp_users
    (
      id bigint NOT NULL,
      lang character varying(10),
      created_hms character(6),
      modified_hms character(6)
    );   
    EXECUTE '
    COPY tmp_users
    FROM ''' || in_fp || '''
    (ENCODING ''' || in_ecd || ''', DELIMITER ''' || E',' || ''')' ;

    INSERT INTO users SELECT * FROM tmp_users;
   
    icnt = (SELECT count(*) FROM tmp_users);

    DROP TABLE tmp_users ;
    return 0;
EXCEPTION
    WHEN OTHERS THEN
    select SQLSTATE || ':' || SQLERRM INTO var_str;
        RAISE INFO 'users insert error:%', var_str;
END ;
$$ language plpgsql VOLATILE ;

 

실행은 다음과 같이 합니다.

SELECT load_users('/tmp/users_20170630.csv','UTF-8');

문제가 있는 부분은 바로 EXECUTE 문의 안에서 csv파일의 데이타 "bb,cc"를 한 칼럼으로 인식시킬수 있는가 하는 문제에 봉착해 있습니다.

정상레코드만을 입력으로 하면 문제 없이 로드되는 것까진 확인 했습니다.

임시 테이블을 작성해서 로드하고 있는 이유는 나중에 칼럼 데이타를 선택수정하기 위함입니다.

아직 수정로직은 들어있지 않은 상태입니다.

 

 

by 김선우 [2017.08.23 19:57:21]

*********************************************************

문제 해결 했습니다.

다음과 같이 하면 문제 없이 들어가네요.

        EXECUTE '
        COPY tmp_users
        FROM ''' || in_fp || '''
        WITH CSV
        (ENCODING ''' || in_ecd || ''')' ;

 

읽어 주신 분들 감사합니다.

 

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입