관련한 글들도 많고, 누군가에게는 별로 어려운 일이 아닐지도 모르지만,

나같이 생짜로 노가다를 해야하는 사람들에게, 조금이라도 도움이 될까 해서,

오늘 삽질한 걸 기록해두자면.

 

 

 

db이전 해야할 게 있다.

번호도 다시매기고, 열(필드)을 이리저리 대폭 수정해야 해서 엑셀에서 편집하려 했는데 여러 난관이 있었다.

 

우선 서버의 mysql 언어 세팅이 latin1으로 되어 있었다.

phpmyadmin에서 csv로 저장하면, 한글이 모두 깨져버린다.

깨진 상태에서 찾아바꾸기를 하고, 좀 손을 댄 다음 복원시켜 보니, 완전히 엉망진창이 됐다.

 

그래서 db 문자셋 바꾸는 방법을 찾았는데, 검색해보니 이런저런 글들은 나왔지만

글에서 나온대로 'ALTER DATABASE TABLE CHARACTER...' 이런 식의 명령어로 바꿔서는 한글이 여전히 그대로 깨지더라.

 

어느 분이 문자셋 전환하는 php소스를 올려놓았지만, 그것도 실행되지 않았다.

그 다음에 따라한게, 이거  였고. 난 find 사용법을 제대로 이해하지 못해서, 그냥 vi로 열고 latin1을 모두 euckr로 바꿨다.

그 다음에 디비 복원시키고, phpmyadmin 이용해서 csv로 저장했다.

 

다음 문제는, csv를 엑셀에서 불러오는데 엔터 이후 내용은 모두 새 레코드로 넘겨버리더라.

그래서 csv에서 제대로 읽을 수 있도록 백업하는 방법을 찾느라 시간을 한참 보내고, 결국 마땅한 걸 못찾고, csv파일을 수정하기로 했다.(이걸 찾긴 했다.)

제로보드 데이터였는데, <br>이 들어가야할 곳에 엔터가 들어가 있었다. 그래서 csv에서 엔터를 모두 <br>로 바꾸려 했는데, 1만 행(레코드)이 넘어가니까, 이게 뜻대로 되질 않는다. 꼬진 내 컴퓨터는 그냥 멎어버리기 일수고.

 

그래서 우선 csv를 서버에 올려놓고 vi에서 바꿔보려 했다.

엔터의 정규식을 몰라서 이것도 한참 찾아헤맸다.

^r, ^n이 서로 어떻게 다른 건지 모르겠는데. 아무튼 이거다.

:%s/^r/<br>/g

:%s/^n/<br>/g

이렇게 입력했는데, 음. 마찬가지로 멎어버렸다.

 

editplus로 열어서 수정했다.

우선 csv 분리자는 [탭]; 이었는데, 중간에 html 태그가 많다보니 세미콜론이 수시로 튀어나와서, 세미콜론 하나로만 할 수가 없었다. 작업을 마치고 생각해보니 그냥 [탭]으로만 해도 됐으려나 싶다.

아무튼. ;\n을 찾아서 ;<br>로 바꾸고

\n을 찾아서 <br>\n으로 바궜다.

&nbsp;를 찾아서 스페이스로 바꾸고

;;<br>을 ;;으로 바꿨다.

그 다음에 \n을 <br>로 바꾸고, ;<br>을 ;\n으로 바꿨다.

한 번에 \n을 <br>로 바꾸고 [탭];<br>을 [탭];으로 바꾸면 쉬울텐데,

내 컴퓨터까 꼬져서인지, \n을 <br>로 바꾸는 작업을 마치지 못한다.(한 행의 글 길이가 늘어날 수록, 속도가 느려졌다. 아마 만 레코드를 한 줄로 만들라고 하니, 그냥 뻗나보다.)

그리고 중간에 ^^;; 이랄지, 태그 뒤에 붙는 세미콜론이랄지, 이런게 많았는데 가려야할 게 많았다.

 

아래 10.26 추가 내용 참고하기.

 

 

이리저리 해서, csv로 만들었다.

정말. 삽질. 삽질.

데이터 이전 비용으로 100만원을 달래길래, 그냥 해보겠다고 나섰는데,

만만치가 않다. 원래 만만한 작업인데, 해본 게 아니어서 그럴지도. ㅠ

 

csv를 db에 입력하는 것도 걱정...

http://taenggun.tistory.com/184

여기 관련 내용이 조금 있던데.. 잘 찾아봐야지.

 


10.23

이어서 한 작업을 마저 적으면,

유닉스 시간을 yyyy-mm-dd hh:mm 으로 바꿔야 해서,

엑셀에서 

셀번호(ex/ A1)/86400+365*70+17+9/24 한 다음

복사해서 값 선택해서 붙여넣기.

그리고 셀 서식을 시간으로 바꿔준다.(이렇게 하고 csv로 저장하면 서식에 나온대로, 그러니까 yyyy-mm-dd 이렇게 저장된다.)

 
카테고리 작업 조금 했고.


작업 마친 다음에
탭으로 분리된 텍스트 파일로 저장한 다음
mysql 로그인 하고
load data infile "/home/..../data.txt" into table xxxx_news_content FIELDS TERMINATED BY "\t";
실행시켰더니.
들어갔다.

그런데 필드를 감쌌던 따옴표(쿼테이션)들이 처리가 안돼서 좀 보기 안 좋은데.. 음.. 그냥 두런다;;

 

10.26

이 모든 게 삽질이었으니.

 

탭으로 분리해 저장한 파일은 쿼테이션 (따움표)을 \" 이렇게 치환할 필요가 없다. 필드를 쿼테이션으로 감쌀 필요도 없다. load data infile .. 하면 있는 그대로 db에 저장된다.

csv로 저장할 때도, 분리자에 세미콜론(;)을 쓸 필요가 없고, 필드를 쿼테이션으로 감싸지 않아도 된다. 탭으로만 분리되어 있으면 엑셀에서 깨끗하게 불러온다. 물론 데이터 안에 탭이 있다면 약간 문제가 되겠지만, 그렇다면 분리자를 탭 3개로 한다든지 하면 된다.

엔터가 들어가 있는 데이터를 한 셀 안에 집어 넣기 위해, 엔터를 모두 <br>로 바꾸는 작업은 그대로 했다. 탭탭탭이 분리자 이기 때문에, 마지막에 빈 필드를 하나 만들어 놓으면 탭탭탭\n(enter)가 레코드의 줄바꿈이 된다. 엔터를 <br>\n로 바꾼 다음에, 탭탭탭<br>\n을 탭탭탭\n으로 바꾸고, <br>\n을 <br>로 바꿨다. 탭탭탭을 데이터에 절대 없을 다른 문자로 바꾼 다음('작업하기 귀찮아 읭읭읭???' 과 같은), 탭을 적당한 문자로 바꿔준다. 그리고 아까 바꿔둔 '작업하기 귀찮아 읭읭읭???' 을 다시 탭으로 바꿔준다.

엑셀에서 불러들이면 끝. phpmyadmin으로 csv를 만들면 쿼테이션 문자를 자동으로 \' \" 으로 바꿔주는 것 같은데, 그것들은 다 본래 쿼테이션 문자로 바꾸면 된다.

CSV 데이터 중 맨 마지막 필드가 datetime 값(2010-10-26 21:20:10)이라면 db에 입력이 안된다. 왜 그런지는 모르겠고. alter table 테이블 add 필드 int(20) 대충 이런 식으로 빈 필드 하나 만들고, CSV파일에서 마지막 필드에 아무 거나 집어 넣어서 만들어 준다.(csv 파일을 열고 \n을 \t0\n 으로 바꿔주면 되겠지요.)

이렇게 한다음 load data infile로 db에 입력하면 입력이 된다. 그 다음 맨 뒤에 붙여놓은 바이트낭비 필드를 삭제한다.

 

그리고. 그리고. 덧붙이면

이 작업을 내 컴퓨터 보다 쪼끔 나은 컴퓨터.. amd 3000 정도 되나.. 거기서 했더니, 10분도 안 걸렸다 -_-;;;;;

 

아. 지구인의 안녕과 내 마음의 평화를 위해 펜티엄3 같은 걸로 작업하지 말아야지.