데이터 및 스프레드시트 · CSV 클리너
CSV 파서가 필드에 따옴표, 삽입된 쉼표 및 줄 바꿈을 처리하는 방법
· 작동 방식
CSV 구문 분석 중 데이터 형식
쉼표로 나누는 작업은 필드에 쉼표, 따옴표 또는 줄 바꿈이 포함될 때까지 작동합니다. 이 게시물에서는 실제 CSV 파서가 사용하는 작은 상태 머신, 인용 규칙이 존재하는 이유, 인용이 깨졌을 때 복구 도구가 수행하는 작업에 대해 설명합니다.
쉼표가 있는 주소 필드는 모든 열을 오른쪽으로 이동했습니다. 단순한 분할이 구문 분석되지 않는 이유
우편 주소, 메모 또는 제품 설명에 해당 문자가 포함되면 쉼표마다 줄을 나누는 작업이 실패합니다. 구분 기호는 파서가 인용된 필드 밖에 있는 동안에만 필드를 끝냅니다. 따옴표 안의 동일한 바이트는 값에 속하며 변경되지 않고 미리보기에 도달해야 합니다.
ToolAcre는 CSV이 단순한 텍스트라고 가정하지 않고 테스트를 통해 이를 증명합니다. 인용된 메모 안에 쉼표가 포함된 세미콜론 파일은 직사각형 모양이 점수화되기 전에 각 후보가 행으로 구문 분석되기 때문에 여전히 세미콜론으로 구분된 것으로 감지됩니다. 원시 구두점 수는 방언을 결정하지 않습니다.
인용 규칙 — 구분 기호, 따옴표 또는 개행 문자가 포함된 필드는 큰따옴표로 묶이고 내부 따옴표는 두 배로 표시됩니다.
선택한 구분 기호, 큰따옴표, 줄 바꿈 또는 캐리지 리턴이 포함된 필드는 직렬화 중에 인용됩니다. 인용된 필드 내의 리터럴 큰따옴표는 인접한 두 개의 인용부호로 표시됩니다. 구문 분석 시 해당 쌍은 셀에 하나의 인용문을 제공하고 필드를 닫지 않습니다.
따옴표는 비어 있는 필드의 시작 부분에 나타나는 경우에만 따옴표 붙은 상태를 엽니다. 12" 파이프와 같이 인용되지 않은 값에서 인용은 리터럴 데이터로 유지됩니다. 해당 구현 선택이 테스트되어 텍스트 중간에 있는 측정 표시가 후속 열을 삼키는 것을 방지합니다.
상태 머신으로서의 파서 — 내부 따옴표와 외부 따옴표, 한 번에 한 문자씩 필드가 끝나는 위치를 결정하는 방법
코어 루프는 현재 필드, 현재 행 및 `inQuotes` 상태를 추적합니다. 따옴표 바깥의 구분 기호는 필드를 푸시하고 CR, LF 또는 CRLF는 행을 푸시합니다. 따옴표 안에는 이스케이프된 쌍을 형성하거나 인용 상태를 종료하는 따옴표를 제외한 모든 문자가 추가됩니다.
이 한 문자 진행은 간단한 정규 표현식이나 줄 분할이 깨지기 쉬운 이유를 설명합니다. 줄 바꿈이 레코드를 끝내는지 여부는 이전 입력에 따라 달라지며, 따옴표가 필드를 닫는지 여부는 다음 따옴표에 따라 달라집니다. 파서는 문자열을 통해 정확하게 최소 상태를 전달합니다.
삽입된 줄 바꿈 — 행이 여러 줄에 걸쳐 있을 수 있는 이유와 grep 또는 wc와 같은 줄 기반 도구가 레코드를 잘못 계산하는 이유
인용된 필드에는 LF, CRLF 또는 단독 CR이 포함될 수 있으며 해당 문자는 값 안에 남아 있습니다. 결과적으로 하나의 논리적 레코드는 텍스트 편집기에서 여러 표시 줄을 차지할 수 있습니다. 줄 기반 명령을 사용하여 물리적 줄을 계산한다고 해서 반드시 데이터 행이 계산되는 것은 아닙니다.
닫는 따옴표 다음에는 다음 구분 기호 또는 레코드 끝이 구조적 의미를 재개합니다. ToolAcre의 테스트는 내장된 LF와 내장된 CRLF를 모두 확인한 다음 단 하나의 행만 생성되었는지 확인합니다. 이 동작은 RFC 레이블에서 추론되지 않습니다. 이는 배송된 상태 머신에 의해 직접 실행됩니다.
깨진 인용 — 파일의 나머지 부분을 삼키는 불균형 인용 및 복구 도구가 필드를 일관되게 다시 인용하는 방법
개요에서는 인용 수정을 약속했지만 닫히지 않은 인용은 본질적으로 모호합니다. ToolAcre는 인용된 상태가 시작된 행에 대해 `UNCLOSED_QUOTE`을 보고하고 이후의 모든 내용을 하나의 필드로 읽습니다. 마감 위치를 만들어내거나 의도한 기록을 다시 인용하지 않습니다.
보수적인 실패는 검사를 위해 소비된 텍스트를 보존하고 이후 인용문이나 개행 문자가 데이터를 의미하는지 여부를 아는 척하는 것을 방지합니다. 소스를 수정하거나 내보내기를 다시 생성한 후 다시 로드하세요. 직렬화는 성공적으로 구문 분석된 테이블을 정규화할 수 있습니다. 잘못된 소스로 인해 알 수 없게 된 행 경계를 복구할 수 없습니다.
깨진 인용이 보고되었지만 수정되지 않았습니다. 닫히지 않은 필드는 나머지 텍스트를 소비합니다.
`name,note`을 헤더로 사용한 다음 Ada와 쉼표 및 줄바꿈이 포함된 메모가 포함된 한 행, 그리고 메모가 `She said "hi"`인 다른 행을 사용합니다. 소스 CSV에서 긴 메모를 인용하고 내부 인용 부호를 `""hi""`로 작성합니다. 파서는 두 개의 데이터 행을 반환하고 두 특수 문자를 모두 유지합니다.
최소한의 인용으로 직렬화하는 경우 일반 이름에는 인용이 필요하지 않지만 참고 필드에는 구조 문자가 포함되어 있으므로 인용됩니다. 중복된 소스 인용문이 사라진 경우에도 해당 출력을 다시 구문 분석하면 동일한 헤더와 셀이 생성됩니다. 바이트별 스타일이 아닌 데이터 평등이 이 왕복을 정의합니다.
여기서 다루지 않는 것 — 백슬래시 이스케이프를 사용하는 방언과 인용할 때 의도를 추측하기 위한 휴리스틱은 실제로 모호합니다.
백슬래시 이스케이프 방언은 파서 외부에 있습니다. 여기서 인용 앞의 백슬래시는 특별한 상태 기계 의미가 없습니다. 텍스트로 남아 있지만 인용문은 큰따옴표 규칙에 따라 해석됩니다. 또한 이 도구는 시작 인용문이 일치하지 않는 상태로 유지되면 의도 추측을 거부합니다.
이러한 경계는 다른 이스케이프 규칙에 대해 구성된 데이터베이스 덤프를 가져올 때 중요합니다. 로드하기 전에 생산자의 방언을 식별하거나 RFC 스타일 인용으로 내보냅니다. 여러 가지 호환되지 않는 이스케이프 규칙을 자동으로 인식하는 파서는 리터럴 백슬래시를 제어 구문으로 바꾸고 불일치를 숨길 수 있습니다.
따옴표와 행이 그대로 유지됩니다. - ToolAcre CSV Cleaner의 따옴표 복구가 표준 파서가 올바르게 읽는 파일을 생성하는 방법
인용된 상태를 존중하면 구분 기호와 레코드 끝이 속한 셀 내부에 유지됩니다. ToolAcre는 또한 세 가지 줄 끝 형식을 처리하고 선행 UTF-8 BOM을 제거하며 행 너비 불일치를 보고합니다. 이러한 동작은 검색 및 바꾸기 트릭 모음이 아니라 하나의 구조적 읽기의 독립적인 부분입니다.
유효한 구문 분석 후 직렬화는 기본적으로 CRLF 출력을 사용하여 포함된 따옴표를 두 배로 늘리고 보호가 필요한 모든 필드를 따옴표로 묶습니다. 유효하지 않은 닫히지 않은 견적 후에는 소스 증거에서 중지하고 복구하십시오. 이 도구는 알려진 셀을 표준화할 수 있습니다. 알 수 없는 테이블을 재구성한다고 주장하지 않습니다.