한 클라이언트가 스테이징 데이터베이스에 로드하기 위해 12,000 행 고객 내보내기를 보냈습니다. 변환하여 가져와서 배송했습니다. 이틀 후 그들의 ops 리드는 뉴저지의 수백 명의 고객이 4 자리 우편 번호를 가지고있는 이유를 물었습니다.
07102 되었다 7102니다. 모든 zip 으로 시작 0,전체 파일에 걸쳐,조용히 절단. 하지 버그에 의해 - 기능에 의해. 유형 추론을 보았다 07102는, "a number, "와 일치하는 것을 보았고, 그것을 하나로 유용하게 변환했습니다. 선행 0 은 숫자가 가진 것이 아닙니다.
나는 구축했다 CSV를 JSON으로 변환합니다 Toolz.dev 에,그리고 이것도 합니다. I'm 은 정확히 어디에 있는지 보여드릴 것입니다,왜냐하면 여러분의 데이터를 묵묵히 바꾸는 변환기는 그냥 실패하는 변환기보다 더 위험하기 때문입니다.
TL;DR: X-1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X CSV를 JSON으로 변환합니다 CSV 를 객체의 배열로 바꾸어,첫 번째 행을 키로 사용하여,브라우저에서 완전히 실행됩니다. It 항상 타입을 추론한다 그리고 당신은 할 수 있습니다't UI에서 그 스위치를 끄십시오 - 이는 의미합니다
07102→7102,1250.50→1250.5, 빈 셀 →null, 그리고true/false→ 부울. 25³를 지난 큰 정수는 트위터 ID 를 저장하는 문자열을 유지합니다. It's 쉼표로만 제공됩니다 인터페이스에서,그래서 유럽 엑셀 won't 구문 분석에서 세미콜론 CSVs. 중복 헤더는 침묵 덮어 쓰기보다는 하드 오류입니다 - 그 one's 대부분의 파서에 대한 진정한 개선. 가져오기 전에 출력을 확인하고,사용 JSON 포맷터 그것을 눈알로.
이 변환기는 실제로 귀하의 데이터에 어떤 영향을 미치나요?
CSV의 모든 값은 텍스트입니다. 29 는 인물들이다 2 그리고 9. JSON 은 real 타입을 가지고 있으므로,컨버터는 다음을 결정해야 한다: is 29 숫자 29 또는 문자열 "29"? There's 는 일반적으로 정답이 없으며 모든 CSV 파서는 추측합니다.
이것은 추측합니다. 항상. Here's 완전한 규칙 집합,코드에서 바로 그리고 그것을 실행하여 검증:
| CSV 값 | JSON 출력 | 유형 |
|---|---|---|
29 |
29 |
번호 |
07102 |
7102 |
숫자 - 제로가 사라졌습니다 |
1250.50 |
1250.5 |
번호 - 센트가 사라졌습니다 |
true / TRUE |
true |
부울 |
null / NIL |
null |
널 |
| (빈 셀) | null |
널 |
9007199254740993 |
"9007199254740993" |
스트링 |
1e3 |
1000 |
번호 |
+5 |
"+5" |
스트링 |
.5 |
".5" |
스트링 |
NO |
"NO" |
스트링 |
+8801712345678 |
"+8801712345678" |
스트링 |
2024-01-05 |
"2024-01-05" |
스트링 |
이 중 몇 가지는 더 자세히 살펴볼 가치가 있습니다. 패턴이 isn't 분명하기 때문입니다.
숫자 regex는 엄격하고 that's 하중 지지입니다. 일치합니다 ^-?\d+$ 그리고 다른 아무것도. That's why +5 그리고 .5 문자열로 생존 - 아니 선행 플러스, 아니 맨 소수점. It's 또한 왜 +8801712345678- 방글라데시 전화번호이고 내 전화번호로 테스트해 보겠습니다. 온전한 상태로 제공됩니다. 스트립 그 + 그리고 you'd 는 숫자 변환에 그것을 잃는다. 그래서 regex 의 엄격함은 실수로 전화 번호를 보호하고,그들의 국가 코드 플러스를 유지 전화 번호 만.
큰 정수는 올바르게 처리되어 놀랐습니다. JavaScript's safe integer range (±25³−1) 밖에 있는 것은 변환되어 망가지는 것이 아니라 의도적으로 문자열로 보관됩니다. Snowflake ID,Twitter ID 및 19 자리 데이터베이스 키가 살아남습니다. 대부분의 순진한 변환기는 호출합니다 parseInt 그리고 당신을 건네주세요 9007199254740992 당신이 있었던 곳 ...93. 이것은 먼저 바인딩을 확인합니다.
NO 문자열을 유지합니다- YAML 파일을 먹는 노르웨이 문제를 조용히 피합니다. 다른 형식,다른 파서,하지만 주목할 가치가 있습니다: 국가 코드 NO 는 config 파서가 어떻게 취급하는지에 대한 동전 던지기이며,여기에 it's 안전합니다.
비어있다는 것은 빈 문자열이 아니라 null을 의미합니다. 그리고 here's 내가 이것을 쓰는 것을 발견 한 작은 문서 버그: the tool's own "How it works" 패널은 말한다 "빈 값은 JSON 출력에서 빈 문자열로 보존됩니다." 그들은 't. inferType('') 반환 null. UI 텍스트가 잘못되었습니다; 코드는 배송하는 것입니다. I & # 39;m 복사본을 수정합니다.
07102는 왜 7102가 되며, 이에 대해 어떻게 해야 합니까?
우편 번호는 숫자가 아니며 컴퓨터 can't tell 이므로.
07102 일치 "digits, 선택적으로 negative" 완벽하게. parseInt("07102", 10) 이다 7102. 선행 영은 의미를 담고 있습니다 ~였다 자료 - 그리고 숫자는 그것을 붙들 방법이 없습니다. 동일한 것은에 일어납니다:
- 우편번호:
07102,01950, 뉴잉글랜드나 뉴저지에 있는 모든 것 - 제품 SKU:
00451 - 플러스가 없는 전화번호:
0171... - 은행/라우팅 코드, 직원 ID, 패딩된 모든 식별자
- 돈:
1250.50→1250.5, 그리고2100.00→2100
마지막 하나는 함께 앉아있을 가치가 있습니다. 1250.50 그리고 1250.5 는 같은 숫자이고 다른 문자열입니다. if you're rendering currency downstream, $1250.5 는 어딘가에 UI 에 나타날 것이고,누군가는 3 주 전에 CSV 변환으로 다시 추적하는 데 1 시간이 걸리는 버그를 제출할 것입니다. (거기서 진짜 교훈은 돈을 정수 센트 또는 소수 문자열로 저장하는 것입니다,절대 플로트가 아닙니다 - 그러나 that's 는 다른 기사를위한 싸움입니다.)
지금 이 도구에는 있습니다 추론을 끄는 토글이 없습니다. 기본 함수는 다음을 수행합니다 inferTypes 옵션과 UI 는 절대 전달하지 않으므로 it's 는 기본값으로 영구적으로 켜집니다. That's a gap,and it's the top item on my list for this tool.
배송될 때까지 귀하의 옵션:
- 출력을 보세요. 진지하게 - 이 도구는 단지 그것을 다운로드하는 대신 창에서 JSON 을 보여줍니다 이유입니다. ID 열을 스캔. 그것은 십초 소요 및 it's 어떻게 내가 우편 번호를 잡았어야했다.
- 견적 증거 업스트림. CSV won't 도움말에서 인용 - 파서는 따옴표를 벗기고 그럼 추론합니다
"07102"스틸은7102. 대신,소스에서 값이 숫자가 아닌 것으로 만듭니다: as 내보내기ZIP-07102또는 스프레드시트에 접두사 열을 추가합니다. - 후처리. 변환한 다음 식별자인 열을 수정하세요:
data.forEach(r => r.zip = String(r.zip).padStart(5, '0')). 추악하지만 정직하고 감사할 만합니다. - 실제 파이프라인에 실제 파서를 사용합니다. 예약되거나 자동화된 모든 것,
csv-parse또는 노드에서 Papa Parse를 사용합니다cast: false제대로 할 것입니다. 브라우저 도구는 일회성.
Parser는 무엇을 올바르게 합니까?
I've는 그것에 열심히 했다, 그래서 here's 나머지 반 - 그리고 이것의 몇몇은 진짜로 당신 'll 다른 곳에 찾아낼 무슨 보다는 더 낫다.
중복 헤더는 어려운 오류입니다. 먹이세요 a,b,a 그리고 그것은 거부합니다: Duplicate headers found: a니다. 대부분의 파서는 묵묵히 마지막 열이 이기게하므로 데이터 열은 단어없이 사라집니다. 여기서 큰 소리로 실패하는 것이 올바른 호출입니다 - JSON 객체에 동일한 이름을 가진 두 개의 키를 가질 수 없으며 그렇지 않으면 데이터를 잃는 척합니다.
인용된 필드는 제대로 처리됩니다, 당 RFC 4180. 따옴표 안쪽에 쉼표는 넣어 둡니다; "" 는 리터럴이 된다 ". 표본 자료는 와 함께 발송합니다 "Mike, Jr." 구체적으로 증명하기 위해서.
인용된 필드 내부의 개행은 작동합니다. 이것은 손으로 굴린 CSV 분할이 일반적으로 죽는 곳입니다. 누군가가 분할됩니다 \n 그리고 다중 라인 주소 필드는 전체 파일을 폭발시킵니다. 행 분할기는 상태 문자를 문자별로 인용하므로 "line1\nline2" 한 분야를 유지합니다.
빈 줄은 건너뜁니다따라서 후행 개행과 길 잃은 빈 행 Excel은 끝에 don't를 떠나 팬텀 개체를 생성합니다.
누더기 행 don't 충돌. 필드가 너무 적고 누락된 키가 다시 나타납니다 null; 너무 많고 헤더 수를 지나는 추가 항목이 자동으로 삭제됩니다. (마지막 부분 I'd는 정확하기보다는 논쟁의 여지가 있다고 부릅니다. 경고는 조용한 폐기보다 낫습니다.)
알아야 할 RFC 편차 1개: 내부 따옴표를 포함하여 값이 잘립니다. RFC 4180 §2.4 는 공백이 필드의 일부이며 should't는 무시되어야 한다고 말합니다 " John " 해야한다 " John ". 이 도구는 당신에게 "John". That's 고의적인 편의 - CSV에서 공백을 추적하는 시간의 99%는 사라지고 싶은 사고입니다. 그러나 패딩이 중요한 라운드 트리핑 데이터인 경우 it's 손실 단계이며 사양은 내 편이 아닙니다.
왜 Won't 나의 세미콜론 CSV 구문 분석?
인터페이스는 쉼표로만 제공되므로 모든 유럽 수출을 포착할 수 있습니다.
소수 구분 기호로 쉼표를 사용하는 로케일의 Excel은 CSV를 씁니다 세미콜론 필드 구분 기호로. 완벽하게 유효하고,극히 일반적이며,이 도구는 구문 분석하지 않습니다. 붙여 넣기 a;b 그리고 문자 그대로 이름이 지정된 단일 키를 얻습니다 a;b 값으로 "1;2". 그것은 does't 오류 - 그것은 단지 오류보다 더 나쁜 하나의 쓸모없는 열을 생산합니다.
구문 분석 함수는 다음을 허용합니다 delimiter 옵션. UI 는 절대 노출시키지 않습니다. 추론 토글과 동일한 클래스의 갭.
해결 방법:
- 찾기 및 바꾸기
;→,먼저 텍스트 편집기에서 - 안전합니다 오직 따옴표 안에 쉼표가 포함된 필드가 없는 경우. - Excel 에서 다시 내보내기 "CSV UTF-8 (쉼표 구분)"으로.
- 를 이용하세요 CSV 뷰어 대신 - 그것은 후보 구분 기호에 걸쳐 열-카운트 일관성을 점수하여 구분 기호 탐지를 수행하므로 세미콜론 파일을 읽습니다. 그것은 won't JSON 으로 변환하지만 it'll 당신이 가지고있는 것을 보여줍니다.
탭도 같은 문제가 있습니다. pipe-delimited 도 마찬가지입니다.
Toolz.dev 에서 CSV 를 JSON 으로 어떻게 변환합니까?
1 단계: 변환기를 엽니 다
로 이동 CSV를 JSON으로 변환합니다. 샘플 데이터가 로드되고 이미 변환되었으므로 모양을 즉시 볼 수 있습니다.
2 단계: CSV 붙여넣기
왼쪽 창에 붙여 넣습니다. There's 파일 업로드 없음- it'는 텍스트 영역이므로 열어보세요 .csv 텍스트 편집기에서 복사합니다. 몇 천 행 that's 벌금에 대해. 200 MB 내보내기의 경우 실제 파서를 사용합니다.
첫 번째 행은 헤더여야 하며,최소한 하나의 데이터 행이 필요합니다. 단일 행이 반환됩니다 CSV must have at least a header row and one data row.
3 단계: 변환
히트 JSON 으로 변환. 당신은 목적의 배열을,행 당 하나,당신의 우두머리에서 열쇠, 들여쓰기된 2 개의 공간을 얻습니다. 행 수는 산출의 위 나타납니다 - 당신이 예상한 무슨을에 대하여 그것을 검사하십시오,그것 it's 가장 싼 가능한 온전한 시험부터.
4 단계: 신뢰하기 전에 출력을 읽으십시오
모두가 건너뛰는 단계와 나는 한 번 건너뛰었습니다. ID 열을 보세요. 돈 열을 보세요. 우편번호가 JSON 에 인용되지 않은 상태로 나타나면,it's a number now.
5 단계: 복사 또는 다운로드
본사 클립보드의 경우, JSON 다운로드 a를 위해 data.json 파일.
브라우저 변환기를 언제 사용하지 말아야 합니까?
경계에 대해 정직함:
| 상황 | 사용 |
|---|---|
| 일회성, 수천 개의 행 | CSV에서 JSON |
| 민감한 데이터 you can't upload | 이것은 - 그것은 결코 당신의 브라우저를 떠나지 않습니다 |
| 예약되거나 자동화된 모든 것 | csv-parse / 노드의 Papa Parse |
| 세미콜론 또는 탭 구분 | CSV 뷰어또는 구분 기호를 수정합니다 |
| 우편번호, SKU, 패딩 ID | 무엇이든 cast: false |
| 점선 헤더의 중첩 출력 | 스크립트 - 평평한 개체만 생성합니다 |
| 100k+ 행 | 스트리밍 파서; 브라우저는 모든 것을 메모리에 저장합니다 |
| 반대 방향으로 가는 | JSON에서 CSV로 |
That "nested output" 행은 이 가이드의 이전 버전이 다르게 주장했기 때문에 명확하게 언급할 가치가 있습니다: 헤더는 다음과 같습니다 user.name 그리고 address.city 하다 아닙니다 중첩된 개체가 됩니다. 문자 그대로 이름이 붙은 키가 있는 평평한 개체를 얻습니다 "user.name". There's 점 표기법 확장 없음,헤더 변환 없음,camelCase 변환 없음. 플랫 객체,헤더 행에 입력된 것과 정확히 같은 키 - 공백,해시 및 모든 헤더 Order # 의 열쇠를 줍니다 "Order #"이는 합법적인 JSON이고 어색한 JavaScript입니다(row["Order #"]).
이 도구에 대 한 도달 하는 이유는 사이트의 나머지 부분과 같은 이유입니다: 귀하의 데이터 doesn't 어디 든 지. 만약 당신이're 변환 고객 내보내기 실제 이름과 이메일 그것에,that's 작은 일이 아니다-서버 측 변환기에 붙여 넣는 것은 제 3 자에 게 개인 데이터의 파일을 건네는 것을 의미,이는 당신의 DPO 와 대화입니다 you'd 오히려 하지. 여기 구문 분석 탭에서 실행 됩니다. Wi-Fi 를 끄고 그것은 여전히 작동 합니다.
자주 묻는 질문
왜 내 우편 번호는 선행 제로를 잃었습니까?
왜냐하면 타입 추론은 그것을 숫자로 변환했고,숫자들은 can't 앞에 있는 0 들을 저장하기 때문이다. 07102 "digits only" 패턴과 일치하므로 됩니다 7102니다. 이것은 우편 번호,패딩된 SKU,직원 ID,그리고 모든 자리 수를 발생 하는 모든 식별자에 영향을 미칩니다. CSV won't 도움말에서 인용-추론이 실행 되기 전에 따옴표가 제거 됩니다. 출력의 ID 열을 확인 하거나,소스에서 값을 접두사로 지정 하 여 숫자가 아닌 것으로 만듭니다.
자동 타입 변환을 끌 수 있나요?
인터페이스에는 없습니다. 기본 함수는 다음을 지원합니다 inferTypes 옵션이지만 UI does't 가 노출하므로 추론은 항상 켜져 있습니다. 원시 문자열이 필요한 경우 Papa Parse 또는 같은 라이브러리 파서를 사용하십시오 csv-parse 캐스팅이 비활성화된 상태에서 변환 후 영향을 받는 열을 수정합니다.
세미콜론 또는 탭 구분 파일을 지원합니까?
아니요 - 인터페이스는 쉼표로만 제공됩니다. 세미콜론 파일은 오류가 아닌 하나의 넌센스 열로 구문 분석되므로 주의하세요. 세미콜론을 먼저 쉼표로 바꾸거나 (인용된 필드에 쉼표가 포함되어 있지 않은 경우에만 안전함) Excel 에서 쉼표로 구분된 것으로 다시 내보내거나 구분 기호를 자동으로 감지하는 CSV 뷰어를 사용하십시오.
빈 세포는 어떻게 되나요?
그들은 된다 null빈 문자열이 아닙니다. tool's 자신의 "작동 방식" panel 은 현재 반대를 말합니다 - panel 텍스트가 잘못되었고 코드가 정확합니다. 리터럴 텍스트를 포함하는 셀 null 또는 nil 또한 된다 null.
헤더 행 없이 CSV를 변환할 수 있나요?
아니요. 첫 번째 행은 항상 헤더로 처리되며 행이 하나만 있는 파일은 헤더와 하나 이상의 데이터 행이 필요하다는 오류를 반환합니다. 데이터에 헤더가 없는 경우 붙여넣기 전에 텍스트 편집기에 하나를 추가합니다.
인용된 필드 내부의 쉼표와 줄 바꿈을 처리합니까?
예, 둘 다입니다. 파서 트랙은 상태 문자를 문자별로 인용하므로 필드는 다음과 같습니다 "Mike, Jr." 쉼표를 유지하고 개행 문자를 포함하는 인용 필드는 행을 분할하는 대신 단일 값을 유지합니다. 이스케이프된 큰따옴표 (Escaped double quotes,)"") RFC 4180에 따라 단일 문자 그대로의 인용문이 됩니다.
중복된 열 이름에서는 어떻게 되나요?
변환을 거부하고 어떤 헤더가 중복되는지 알려줍니다. That's deliberate - JSON 객체 can't 는 두 개의 동일한 키를 가지므로 대안은 자동으로 열을 삭제하는 것입니다. 많은 파서가 정확히 그렇게합니다; 열 이름을 바꾸고 다시 변환하십시오.
행 제한이 있나요?
강제된 제한은 없지만 모든 것이 browser's 메모리에서 실행됩니다: CSV 텍스트,파싱된 배열 및 포맷된 JSON 문자열이 모두 한 번에 존재합니다. 수천 개의 행이 편안합니다; 6 자리 행 카운트는 탭을 힘들게 합니다. 크기가 큰 파일의 경우 대신 Node 에서 스트리밍 파서를 사용하십시오.
내 데이터가 어디에나 업로드됩니까?
아니오. 파싱은 당신의 브라우저에서 일어나고 당신의 CSV 는 결코 전송되지 않습니다,당신이 couldn't 합법적으로 서버 측 공구에 풀칠하는 고객 수출 그리고 다른 자료를 위해 안전한 만드는 무슨이 쉬운 방법 - DevTools 를 열거나,변환하는 동안 네트워크 탭을 보거나,그냥 당신의 Wi-Fi 를 끄고 아직도 작동한다는 것을 보십시오.
짧은 버전
CSV에서 JSON으로의 변환은 컴퓨팅에서 가장 지루한 변환처럼 보이며 파서가 문자열을 결정하는 순간 is't입니다 의미는, don't가 그들자신을 알리는 방법안에 틀릴 수 있는다. 과실 없음, 경고 없음, 다만 2 일 후에 떠오르는 4 자리 우편 번호.
그래서: 변환, 그럼 출력을 읽습니다니다. 숫자인척하는 식별자인 컬럼을 확인한다. 인용되지 않은 채로 나왔다면 you've 는 뭔가를 잃었다. 그 습관은 십초가 걸리고 나에게 당황스러운 이메일을 저장했을 것이다.
X-1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X CSV를 JSON으로 변환합니다 는 일회성 작업에 능숙합니다 - 인용된 필드,임베디드 개행,큰 정수 ID,중복 헤더의 시끄러운 실패,모두 데이터가 브라우저에서 벗어나지 않은 상태에서. It's 쉼표 전용,항상 유형을 추론하고,평평한 개체를 물기 전에 세 가지를 모두 알게되었습니다.
다른 방향으로 가기: JSON에서 CSV로. 지저분한 CSV를 먼저 검사하기 위해: CSV 뷰어. 출력을 확인하기 위해: JSON 포맷터. 그리고 만약 당신의 data's 가 config 파일을 향하고 있다면, JSON에서 YAML로. 더 넓은 투어는 에 있습니다 JSON 도구 가이드 그리고 the 코딩 도구 가이드.



