data는 단순히 예시이며 실제 데이터는 솔루션 결과들이었다!
const data = 'John,Doe|1\n Jane|2\nMary,a|3'
이런 데이터를
A열에만 '\n' 기준으로 행으로 쌓인 엑셀파일로 변환하고 싶었다.
엑셀 파일은 /data/test.xlsx 였다.
그런데
이렇게 쌓이는 데이터를 발견했고,
쉼표 기준으로 열이 분리된다는 엑셀의 특징을 알게되었다.
기존의 나의 코드는 단순했다.
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);
이렇게 하니 원하는대로 적재가 되었다!
다 된줄 알았으나 여러가지의 엑셀파일을 하나의 엑셀로 합치려고 하다가 또다른 이슈를 발견했다.
</a/name.csv>
John,Doe|1
Jane|2
</b/name.csv>
Dan|1
Sarah|8
이런 2개의 엑셀을
</total/name.csv>
이렇게 하나의 엑셀로 합쳐서 전달하려했다.
문제는.. 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
덮어쓰는 부분에서 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
이렇게 하면 각 파일의 내용에 별도의 행이 추가된다.
빅데이터팀과 협업하게 되면 DB 에 직접 데이터를 쌓아주는게 좋지만 지금 프로젝트에서는 빅데이터팀 DB에 접근할 수 있는 환경이 안돼서 엑셀 파일로 전달을 하게 되었다. (빅데이터의 원천데이터들은 txt나 엑셀 파일로 이루어지면 데이터 관리와 보정이 편하기 때문일 듯)
엑셀파일로 변환하는 작업은 이렇게 쉼표기준으로 분리되거나 한글변환이 안되거나 등 이슈가 많음으로 꼭꼭 많은 검토를 통해 이슈사항을 확인해야하는 것 같다.
그리고 쉘은 crontab 을 사용하여 호출하게 했다~!
wow