CSV를 손으로 파싱하지 마십시오!

3428 단어 javascriptprogramming
CSV 데이터를 여러 번 구문 분석하는 사용자 정의 JavaScript 코드를 보았습니다. 다음과 같이 보입니다.

const csvData = fs.readFileSync(csvFilePath, 'utf8');
const lines = csvData.split('\n');
const rows = lines.map(line => line.split(','));


매우 간단하며 콘텐츠를 알고 있는 단일 정적 CSV 파일을 구문 분석하는 경우 괜찮을 수 있습니다. 그러나 알 수 없는 CSV 파일을 구문 분석하는 경우에는 이렇게 하지 마십시오. 손상될 수 있는 방법이 많습니다.

무엇이 잘못될 수 있습니까?



이스케이프된 셀



CSV 파일의 열에는 쉼표가 포함될 수 있습니다. 이러한 열은 일반적으로 따옴표로 이스케이프 처리됩니다. 이러한 열이 있는 행의 원시 데이터는 다음과 같습니다.

Name,Best Line
Hamlet,"To be, or not to be"


두 번째 줄에는 두 개의 쉼표가 있지만 세 개가 아닌 두 개의 열이 있는 테이블이 생성됩니다.


이름
베스트 라인


작은 촌락
될 것인가, 아닐 것인가


이렇게 하면 , 에서 분할되는 간단한 CSV 구문 분석기 구현이 중단됩니다.

줄 끝



간단한 CSV 구문 분석기 구현은 LF 줄 끝( \n )을 가정하지만 Windows에서 생성된 CSV 파일을 포함한 텍스트 파일에는 종종 CRLF 줄 끝( \r\n )이 있습니다. 또한 이스케이프된 셀 내에 줄 끝 문자가 있을 수 있습니다. 말할 필요도 없이 이러한 경우는 단순한 CSV 파서 구현을 깨뜨립니다.

대신 수행할 작업



이를 위해 만들어진 라이브러리를 가져옵니다. 나는 csv-parse을 사용하는 것을 좋아합니다. 사용하기 쉽습니다.

import { parse as csvParse } from 'csv-parse/sync';

const csvData = fs.readFileSync(csvFilePath, 'utf8');
const rows = csvParse(csvData);


그게 다야.

결론



간단한 작업으로 보이는 문제를 해결하기 위해 라이브러리를 가져오는 것을 좋아하는 사람은 아무도 없다는 것을 알고 있지만 임의의 CSV를 올바르게 구문 분석하는 것은 실제로 보기보다 훨씬 어렵습니다. 고통을 덜고 다른 사람의 전투 강화 파서를 사용하십시오.

좋은 웹페이지 즐겨찾기