문자열 데이터 엑셀 파일로 적재과정 중 생긴 문제들..

sein lee·2024년 5월 10일
0

project

목록 보기
2/3
post-thumbnail
post-custom-banner

History1

data는 단순히 예시이며 실제 데이터는 솔루션 결과들이었다!

const data = 'John,Doe|1\n Jane|2\nMary,a|3'

이런 데이터를

A열에만 '\n' 기준으로 행으로 쌓인 엑셀파일로 변환하고 싶었다.
엑셀 파일은 /data/test.xlsx 였다.

Problem 1

그런데
이렇게 쌓이는 데이터를 발견했고,
쉼표 기준으로 열이 분리된다는 엑셀의 특징을 알게되었다.

Solve 2

기존의 나의 코드는 단순했다.

const dir = '/data/test.csv';
const data = 'John,Doe|1\n Jane|2\nMary,a|3';
fsPromises.appendFile(dir,data); //nodeJs 라이브러리

쉼표를 문자취급을 해줘야하기때문에 ''으로 감싸야 했고 그래서 나는 data 의 구조를 배열로 변경했다. 그리고 xlsx 라이브러리를 사용하기로 했다.

const dir = '/data/test.csv';
//구조변경
const data = ['John,Doe|1', 'Jane|2', 'Mary,a|3'];

//엑셀 워크북 생성
const workbook = xlsx.utils.book_new();
//각 데이터가 시트의 한 행 (2차원배열)
const worksheet = xlsx.utils.aoa_to_sheet(data.map(row => [row]));

//시트를 워크북에 추가
xlsx.utils.book_append_sheet(workbook, worksheet, 'Sheet1');

// 엑셀 파일 저장 (디렉토리를 포함한 경로)
xlsx.writeFile(workbook, dir);

이렇게 하니 원하는대로 적재가 되었다!

History2

다 된줄 알았으나 여러가지의 엑셀파일을 하나의 엑셀로 합치려고 하다가 또다른 이슈를 발견했다.
</a/name.csv>

John,Doe|1 
Jane|2

</b/name.csv>

Dan|1 
Sarah|8

이런 2개의 엑셀을
</total/name.csv>

이렇게 하나의 엑셀로 합쳐서 전달하려했다.

Problem2

문제는.. total/name.csv 에 a/name.csv를 적재하고 덮어쓰기로 b/name.csv 를 적재하는데 결과가

이런식으로 a.csv의 마지막행과 b.csv의 첫번째 행이 합쳐진다는 문제였다.

우선 각각 a,b 디렉토리에서 name.csv 파일을 읽어오고,
그 파일들을 name.csv 로 합치는 로직이었고 쉘스크립트로 작성하였다.

for ((i=1; i${#dirList[@]}; i++));
do
	# 각각의 디렉토리 접근 (a,b 디렉토리)
	VALUE=${dirList[i]};
    cd ${VALUE##*/}
    
    csvList=( `find . -type f` );
    #디렉토리 csv 파일 탐색
    for((j=0; j<${#csvList[@]}; j++));
    do
    	#덮어쓰기
    	cat ${csvList[j]} >> /total/name.csv
    done 
done

Solve2

덮어쓰는 부분에서 cat 대신 tail -n +1 로 사용해 보았는데 b.csv 의 첫행이 날아가고 두번째 행부터 적재가 되더라..

생각보다 해결방안은 단순했다.
줄바꿈 이었다!
처음엔 csv 내에 마지막행에 직접 '\n'으로 해볼까도 싶었는데 그러면 데이터를 직접 건드리는 거라 쉘에서 처리 해보기로 했다.

for ((i=1; i${#dirList[@]}; i++));
do
	# 각각의 디렉토리 접근 (a,b 디렉토리)
	VALUE=${dirList[i]};
    cd ${VALUE##*/}
    
    csvList=( `find . -type f` );
    #디렉토리 csv 파일 탐색
    for((j=0; j<${#csvList[@]}; j++));
    do
    	#덮어쓰기
    	cat ${csvList[j]} >> /total/name.csv
        #줄바꿈처리
        echo "" >> /total/name.csv
    done 
done

이렇게 하면 각 파일의 내용에 별도의 행이 추가된다.

End

빅데이터팀과 협업하게 되면 DB 에 직접 데이터를 쌓아주는게 좋지만 지금 프로젝트에서는 빅데이터팀 DB에 접근할 수 있는 환경이 안돼서 엑셀 파일로 전달을 하게 되었다. (빅데이터의 원천데이터들은 txt나 엑셀 파일로 이루어지면 데이터 관리와 보정이 편하기 때문일 듯)

엑셀파일로 변환하는 작업은 이렇게 쉼표기준으로 분리되거나 한글변환이 안되거나 등 이슈가 많음으로 꼭꼭 많은 검토를 통해 이슈사항을 확인해야하는 것 같다.

그리고 쉘은 crontab 을 사용하여 호출하게 했다~!

profile
개발감자
post-custom-banner

2개의 댓글

comment-user-thumbnail
2024년 5월 11일

wow

1개의 답글