오지's blog

snowflake에 insert시 .0이 붙는 문제 해결 과정 본문

개발노트/데이터베이스

snowflake에 insert시 .0이 붙는 문제 해결 과정

오지구영ojjy90 2022. 4. 26. 11:03
728x90
반응형

크롤링해서 받은 csv파일에 bom문자가 있었다. 이것을 

df = pd.read_csv(os.path.join(filefullpath, filename), encoding='utf-16', header=None)
df.iloc[:,0] = df.iloc[:,0].apply(lambda x : x.replace("\ufeff",""))

이렇게 가져오면 문제가 주문번호와 같은 숫자같은 문자열에 .0이 붙어 float형으로 바뀌었다. 알고보니 dataframe에서 int타입인줄알고 읽었는데 nan값이 있으면 int타입은 nan값을 허용하지 않으므로 float형으로 자동적으로 바뀌는 문제가 있었다.

그렇다고 

df.iloc[:,0] = DF.iloc[:,0].apply(lambda x : x.replace("\ufeff","").replace("\"", ""))

다음과 같이 csv파일에서 "따옴표를 없애자니 , 가 있는 데이터를 두개의 컬럼이라고 잘못가져올까봐 이 방법은 지향했다. 물론 첫번째 컬럼은 주키라서 , 가 경우는 없었다. 그래도 클리어하게 해결하고자 , 고민을 하였다. 

 

그 결과 

df = pd.read_csv(os.path.join(filefullpath, filename), encoding='utf-16', header=None, dtype=object)
df.fillna('NULL')
df.iloc[:,0] = df.iloc[:,0].apply(lambda x : x.replace("\ufeff",""))

다음과 같이 모두 문자열로 바꿔주고 쿼리 단에서 nan은 null값으로 처리하고 type을 맞춰주는 방식으로 해결하였다.

 

CREATE OR REPLACE FILE FORMAT ODS.O_GOQA TYPE=csv SKIP_HEADER=1 FIELD_OPTIONALLY_ENCLOSED_BY = '"', NULL_IF=('0000-00-00 00:00:00','null', 'NULL', '0000-00-00', 'nan', 'NaN');

 

INSERT INTO ODS.O_faq(SNO, MALLSNO, CATEGORY, SUBJECT, CONTENTS, ANSWER, ISBEST, SORTNO, BESTSORTNO, REGDT, MODDT, LOAD_DTTM) SELECT replace(T.$1,'"')::number,T.$2,T.$3,T.$4,T.$5,T.$6,T.$7,T.$8,T.$9,T.$10,T.$11,T.$12 from @l/220426/es_faq.csv (FILE_FORMAT=>'O_faq') as T;
Comments