인생 한방... 은 아니고, 로또 1등이래봤자.. 삶이 조금 나아진다 정도니..
ㅇㅅㅇ
일단 아무꺼나 만들어 가는 과정 틈날때마다 올린다는 의미로 올려봄.
ㅇㅅㅇ
처음부터 큰 계획을 잡으면 꼬무룩~하니깐 하나씩 ㅇㅅㅇ
1.
먼저 로또 사이트 가서 엑셀 1회차 부터 다운로드 ( 현재 974회차 )
https://dhlottery.co.kr/gameResult.do?method=byWin
구조를 보면 download url만 가지고도 추가 회차분만 업뎃하기 좋게 되어 있긴하지만.. 일단 그 부분은 나중에나 생각한다.
--> 받아보면 HTML 파일임 ( 차후에 curl이랑 python 등으로 만들면 될듯 ㅇㅅㅇ )
2. 로또 마스터 테이블부터 만들자.
일단 요즘 오라클 사용한 플젝 진행 중이니 오라클을 이용.
https://www.oracle.com/kr/database/technologies/xe-downloads.html
무료로 공개되어 있는 버젼이 현재는 18 버젼이니.. 오라클 받아서 설치
그후 dbeaver 같은 DB 접속용 무료툴 받고 오라클 접속.
사용자랑 테이블 스페이스 만듬.
마스터 테이블을 만들기 위해서
회차, 추첨일, 당첨번호 1 / 2 / 3 / 4 / 5 / 6, 보너스 컬럼을 가진 테이블을 만든다.
CREATE TABLE TB_LOTTO_MST (
"IDX" NUMBER(6,0),
"DRWDAY" VARCHAR2(8) NOT NULL ENABLE,
"NO1" NUMBER(2,0) NOT NULL ENABLE,
"NO2" NUMBER(2,0) NOT NULL ENABLE,
"NO3" NUMBER(2,0) NOT NULL ENABLE,
"NO4" NUMBER(2,0) NOT NULL ENABLE,
"NO5" NUMBER(2,0) NOT NULL ENABLE,
"NO6" NUMBER(2,0) NOT NULL ENABLE,
"BNO" NUMBER(2,0) NOT NULL ENABLE,
CONSTRAINT TB_LOTTO_MST_PK PRIMARY KEY (IDX)
);
COMMENT ON TABLE TB_LOTTO_MST IS '로또 마스터 테이블';
COMMENT ON COLUMN TB_LOTTO_MST.IDX IS '회차';
COMMENT ON COLUMN TB_LOTTO_MST.DRWDAY IS '추첨일';
COMMENT ON COLUMN TB_LOTTO_MST.NO1 IS '번호 1';
COMMENT ON COLUMN TB_LOTTO_MST.NO2 IS '번호 2';
COMMENT ON COLUMN TB_LOTTO_MST.NO3 IS '번호 3';
COMMENT ON COLUMN TB_LOTTO_MST.NO4 IS '번호 4';
COMMENT ON COLUMN TB_LOTTO_MST.NO5 IS '번호 5';
COMMENT ON COLUMN TB_LOTTO_MST.NO6 IS '번호 6';
COMMENT ON COLUMN TB_LOTTO_MST.BNO IS '보너스 번호';
첨에 번호를 숫자형으로 할까 문자형으로 할까 하다가 일단은 숫자형으로 잡았다.
번호라고 해봤자 로또에서는 기호적 의미 밖에 없기 때문에
향후 다양한 통계 및 그래프 밑작업 재료로 하기에는 문자열로 두는 것도 좋지만.. 일단은 숫자로 뒀음.
날짜도 일단은 비교 용도 보다는 순수하게 정보성 의미라 문자열로 둠.
3. 다음은 받아온 엑셀을 밀어 넣자. 요즘 프로젝트에서 sqlldr를 주로 다루고 있기 때문에 이것을 이용하도록 하겠음.
받아온 엑셀을 열어보면 아래처럼 그닥 바로 밀어넣기에는 좋은 형태는 아니다.
가능한 귀차니즘을 최소화하는 것이 첫번째니깐.. 일단 내용 그대로 csv로 저장한다. ( 기본적으로 탭 사이가 ;로 구분 되어 있다. )
이제 sqlldr를 사용하기 위해 ctl 파일을 만든다.
먼저 저장된 csv을 봐보면..
회차별 추첨결과;;;;;;;;;;;;;;;;;;;
년도;회차;추첨일;1등;;2등;;3등;;4등;;5등;;당첨번호;;;;;;
;;;당첨자수;당첨금액;당첨자수;당첨금액;당첨자수;당첨금액;당첨자수;당첨금액;당첨자수;당첨금액;1;2;3;4;5;6;보너스
2021;974;2021.7.31;17;1,317,034,523원;66;56,539,361원;2,636;1,415,629원;129,473;50,000원;2,149,319;5,000원;1;2;11;16;39;44;32
;973;2021.7.24;8;2,912,742,750원;42;92,468,024원;2,257;1,720,717원;117,757;50,000원;2,003,966;5,000원;22;26;31;37;41;42;24
;972;2021.7.17;20;1,124,886,244원;80;46,870,261원;2,570;1,458,997원;126,989;50,000원;2,122,398;5,000원;3;6;17;23;37;39;26
위에서 3개가 헤드값이라서 SKIP할 필요가 있다.
그후 2번째가 회차, 3번째가 날짜 ( YYYY.MM.DD 형식 ), 14번째 부터 숫자 1~6, 보너스 번호가 있다는 것을 알 수 있다.
ctl 파일을 만들면
-- sqlldr id/passwd control=lotto.ctl data=lotto_974.csv
OPTIONS (
SKIP = 3 -- 3줄 스킵
)
LOAD DATA
APPEND -- 일반적으로는 TRUNCATE 시킨후 전체 적재하지만 추가시는 APPEND
INTO TABLE TB_LOTTO_MST
FIELDS TERMINATED BY ';'
trailing nullcols
(
dummy1 filler, -- 스킵할 데이타들
IDX ,
DRWDAY "TO_CHAR(TO_DATE(:DRWDAY, 'YYYY.MM.DD'), 'YYYYMMDD')",
dummy4 filler,
dummy5 filler,
dummy6 filler,
dummy7 filler,
dummy8 filler,
dummy9 filler,
dummy10 filler,
dummy11 filler,
dummy12 filler,
dummy13 filler,
NO1 ,
NO2 ,
NO3 ,
NO4 ,
NO5 ,
NO6 ,
BNO
)
위와 같이 실행하면..
아래와 같이 데이터가 적재 된 것을 확인할 수 있다
SELECT
IDX,
DRWDAY,
TO_CHAR(NO1, '00') NO1,
TO_CHAR(NO2, '00') NO2,
TO_CHAR(NO3, '00') NO3,
TO_CHAR(NO4, '00') NO4,
TO_CHAR(NO5, '00') NO5,
TO_CHAR(NO6, '00') NO6,
TO_CHAR(BNO, '00') BNO
FROM
TB_LOTTO_MST
;
다음에는 마스터 데이터를 가지고 각종 통계를 내보자.
R을 이용하는게 나을까나 ?
ㅇㅅㅇ
로또 번호 예측해주는거?
예측 보다는 단순 통계 부터 시작 ㅇㅅㅇ
일단 R도 이용해서 그래프로 나타내볼겸.. 가장 최근 n회차 중에 나온 숫자들 정렬해서 보여주는 것 부터 하는 중 ㅇㅅㅇ
오 재밌을듯