Uinx/Linux: 줄 바꿈 개행이 포함된 CSV 파일의 전체 라인 수 구하기


위 이미지처럼 줄 바꿈 개행이 포함된 CSV 파일에서 줄 바꿈 개행으로 인한 라인을 제외한 전체 행(row) 수를 구하는 코드를 소개합니다.
코드 소개 전에 아래와 같은 고민을 하시는 분들에게 추천합니다.
일반적으로 PHP에서 $row_count = count(file('filename.csv')); 코드로 전체 행 수를 찾습니다. 그러나 개행이 포함되었다면 정확한 행 수가 아닙니다.
fgetcsv()를 사용하면 해결은 가능하지만 메모리 이슈로 exec('wc -l filename.csv') 이렇게 시도해보지만 해결되지 않습니다.
그럴 때 아래 코드를 참고해보세요.

샘플 CSV 파일(sample.csv)

1행/1열,1행/2열,1행/3열
2행/1열,2행/2열,2행/3열
3행/1열,3행/2열,"3행/
3열"
4행/1열,4행/2열,4행/3열

상세 코드

#!/usr/bin/env bash
# CSV 파일 경로
source_fie="/home/sample.csv"

# CSV 첫 행에서 콤마(,) 수
title_column_count=$(head -n1 ${source_fie} | grep -o "," | wc -l)

# title_column_count 기준으로 한 행에 들어갈 값을 재 정의하고 전체 라인 수를 반환
row_count=$(sed -e ":top" -e "s/,//${title_column_count}" -e "t end" -e "N; b top" -e ":end" -e "s/\n//g" ${source_fie} | wc -l)

# 전체 행 수 출력
echo "일반적인 전체 라인 수: `wc -l < ${source_fie}`"
echo "개행을 제거한 전체 라인 수: ${row_count}"

한줄 코드

# /home/sample.csv 파일 명 2곳 변경 필요
# sed 명령어에서 반복적인 -e 옵션을 ; 으로 변경
sed -e ":top;s/,//$(head -n1 /home/sample.csv | grep -o "," | wc -l);t end;N; b top;:end;s/\n//g" /home/sample.csv | wc -l

마무리하며

한 줄 명령으로 해결해보자는 취지로 작성된 코드이며 다양한 사례를 충족시키지 못할 수 있습니다. 더 좋은 방법이나 개선해야 할 부분을 공유해주시면 많은 도움이 될 거 같습니다.

함께보기