SQL

건축인허가 층별 데이터 일괄 업로드하는 방법

Link2Me 2024. 9. 8. 11:58
728x90

건축인허가 층별 데이터를 DB에 업로드하는 방법을 PHP 코드로 구현해서 하려고 하니 엄두가 나지 않아서 MariaDB에서 제공하는 대용량 LOCAL FILE 업로드하는 방법으로 했다.

이 방법으로 하면 약 1500만개 데이터를 DB TABLE 에 데이터 저장하는데 15분 이내로 가능하다.

 

https://open.eais.go.kr/opnsvc/opnSvcInqireView.do# 에서 파일을 다운로드 한다.

매월 업데이트되는 파일을 받아서 업로드해야 하는데 중복체크 이런 걸 하려면 시간도 너무 오래걸리기 때문에 매월 자료 받으면 기존 데이터는 일괄 삭제하고 신규 데이터를 업로드하는 방식으로 하는게 낫다.

아쉽게도 파일의 인코딩모드가 euckr 로 되어 있기 때문에 파일을 나누고 EditPlus 같은 툴을 이용하여 UTF-8로 인코딩 모드를 변경한 후에 데이터 업로드를 해야 정상적으로 한글이 깨지지 않는다.

 

그리고 파일 구조 엑셀 파일을 다운로드하여 테이블 설계를 먼저 해야 한다.

테이블 설계시에는 칼럼의 개수와 순서가 반드시 일치하도록 해야 한다.

 

건축데이터 민간 개방시스템에서 제공하는 자료는 실시간 자료는 아니고 2개월 늦은 데이터라고 보면 된다.

실시간 데이터를 원하면 직접 세움터 사이트에서 조회를 해서 엑셀로 받아서 봐야 한다.

 

# 건축데이터 민간 개방시스템 대용량 파일 제공하는 게시판에서 파일을 받으면 utf-8 로 되어 있지 않다.
# 그냥 대용량 파일 업로드를 했더니 한글이 깨진다.
 
# 리눅스 파일 나누기
-n l/N 옵션: 파일 줄을 고려하여 N등분 한다.
-d 옵션: 000102 형태로 숫자로 접미사를 만든다.
--additional-suffix 옵션: 나눠진 파일명 뒤에 접미사를 추가로 붙인다.
split -n l/3 ---additional-suffix=.txt mart_kcy_03.txt kcypart_
 
# editplus 파일로 열어서 ANSI 를 UTF8 로 변경하여 저장한다.
 
mysql -uroot -p
SHOW VARIABLES LIKE 'character_set%';
 
use testdb;
 
DROP TABLE dgo_blding_floor;
CREATE TABLE dgo_blding_floor (
  pkfCode varchar(33NOT NULL COMMENT '관리_층별개요_PK',
  pkdCode varchar(33DEFAULT NULL COMMENT '관리_동별개요_PK',
  pkCode varchar(33NOT NULL COMMENT '관리_허가대장_PK',
  Address varchar(250DEFAULT NULL COMMENT '지번주소',
  bldNM varchar(100DEFAULT NULL COMMENT '건물명',
  sigungu varchar(5DEFAULT NULL COMMENT '시군구코드',
  bjdong varchar(5DEFAULT NULL COMMENT '법정동코드',
  daeji varchar(1DEFAULT NULL COMMENT '대지산구분code',
  bun varchar(4DEFAULT NULL COMMENT '번',
  ji varchar(4DEFAULT NULL COMMENT '지',
  spNM varchar(200DEFAULT NULL COMMENT '특수지명',
  block varchar(20DEFAULT NULL COMMENT '블록',
  Loot varchar(20DEFAULT NULL COMMENT '로트',
  stCode varchar(2DEFAULT NULL COMMENT '구조_코드',
  stCodeNM varchar(100DEFAULT NULL COMMENT '구조_코드명',
  mCode varchar(5DEFAULT NULL COMMENT '주용도코드',
  mCodeNM varchar(100DEFAULT NULL COMMENT '주용도코드명',
  fNO int(4NOT NULL DEFAULT 0 COMMENT '층번호',
  fArea double NOT NULL DEFAULT 0 COMMENT '층면적',
  fCode varchar(2DEFAULT NULL COMMENT '층구분코드',
  fCodeNM varchar(100DEFAULT NULL COMMENT '층구분코드명',
  archCode varchar(4DEFAULT NULL COMMENT '건축구분코드',
  archCodeNM varchar(100DEFAULT NULL COMMENT '건축구분코드명',
  regDate varchar(8DEFAULT NULL COMMENT '생성일자'
ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
ALTER TABLE dgo_blding_floor
  ADD UNIQUE KEY pkfCode (pkfCode) USING BTREE,
  ADD KEY pkCode (pkCode) USING BTREE;
 
COMMIT;
 
 
LOAD DATA LOCAL INFILE '/home/httpd/htdocs/sample/uploads/kcypart_00.txt' 
INTO TABLE dgo_blding_floor 
FIELDS TERMINATED BY '|' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
 
 
LOAD DATA LOCAL INFILE '/home/httpd/htdocs/sample/uploads/kcypart_01.txt' 
INTO TABLE dgo_blding_floor 
FIELDS TERMINATED BY '|' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
 
 
LOAD DATA LOCAL INFILE '/home/httpd/htdocs/sample/uploads/kcypart_02.txt' 
INTO TABLE dgo_blding_floor 
FIELDS TERMINATED BY '|' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
 
 
DELETE FROM dgo_blding_floor WHERE SUBSTRING_INDEX(Address, ' '1NOT IN ('서울특별시''경기도''인천광역시');
 

 

728x90