一位客戶向我發送了 12,000 行客戶匯出,以載入到暫存資料庫中。我轉換了它,導入了它,然後發貨了。兩天后,他們的營運負責人詢問為什麼新澤西州的數百名客戶擁有四位郵遞區號。
07102 已經成為 7102。整個檔案中每個以零開頭的 zip 都會被悄悄截斷。不是因為錯誤--因為一個功能。類型推斷查看 07102,看到一些與 " 相符的東西;一個數字,"並幫助將其轉換為一。前導零不是數字所具有的東西。
我建造了 CSV 到 JSON 轉換器 在 toolz。dev 上,它也能做到這一點。我'我將向您展示具體的位置,因為默默更改資料的轉換器比剛剛失敗的轉換器更危險。
TL;DR: 的 CSV 到 JSON 轉換器 將 CSV 轉換為物件數組,使用第一行作為鍵,完全在瀏覽器中運行。它 總是推斷類型 你可以't 在 UI 中將其關閉 - 這意味著
07102→7102,1250.50→1250.5,空單元格 →null, 和true/false→ 布爾。超過 25³ 的大整數保留字串,這會儲存您的 Twitter ID。它's 僅逗號 在介面中,來自 European Excel 的分號 CSV 獲勝並#39;t 解析。重複標頭是一個重寫錯誤,而不是無聲覆蓋 - 那個'比大多數解析器有真正的改進。匯入之前檢查輸出,然後使用 json 格式化程式 盯著它看。
此轉換器實際上對您的資料有什麼作用?
CSV 中的每個值都是文字。 29 是人物 2 和 9. JSON 有實數類型,因此轉換器必須決定: 是 29 數字 29 或字串 "29"?那裡'一般來說沒有正確的答案,每個 CSV 解析器都會猜測。
這個人猜測。永遠。這裡'是完整的規則集,直接從程式碼中獲取並透過運行它進行驗證:
| 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" |
字串 |
其中一些值得仔細觀察,因為模式是 't 明顯。
數字正規表示式是嚴格的,並且#39;s 承重。 它匹配 ^-?\d+$ 沒有別的了。那'為什麼 +5 和 .5 作為字串生存 - 沒有前導加號,沒有裸小數點。 It'也是為什麼 +8801712345678- 一個孟加拉國電話號碼,我用我的電話號碼進行測試 - 完好無損地通過。剝離那個 + 而你'會因數字轉換而失去它。因此,正規表示式的嚴格性是意外地保護電話號碼,並且僅保護保留其國家/地區代碼加號的電話號碼。
大整數處理得正確,這讓我感到驚訝。 JavaScript' 以外的任何內容;安全整數範圍 (±25³ -1) 被故意保留為字串,而不是轉換和損壞。 Snowflake ID、Twitter ID 和 19 位元資料庫金鑰得以保留。大多數樸素的轉換器都會呼叫 parseInt 並把你遞給你 9007199254740992 你去過的地方 ...93.這個首先檢查綁定。
NO 保持字串- 這悄悄地迴避了挪威吃掉 YAML 檔案的問題。不同的格式,不同的解析器,但值得注意的是:國家代碼 NO 是一個硬幣翻轉,說明配置解析器如何處理它,這裡它'安全。
空意味著空,而不是空字串。 這裡'是我發現的一個小文檔錯誤,寫了這個:工具'擁有&引用;它是如何運作的&引用;面板說 &引用;空值在 JSON 輸出中保留為空字串。&引用; 它們是#39;t。 inferType('') 回報 null. UI文字錯誤;代碼是發貨的。 I'm 修復副本。
為什麼 07102 變成 7102,我該怎麼辦?
因為郵遞區號不是數字,電腦可以't 告訴。
07102 匹配並引用;數字,可選負數和引用;完美。 parseInt("07102", 10) 是 7102。 前導零帶有意義-它 是 數據和數字無法容納它。同樣的事情也發生了:
- 郵遞區號:
07102,01950,新英格蘭或新澤西的任何地方 - 產品 SKU:
00451 - 沒有加號的電話號碼:
0171... - 銀行/路由代碼, 員工 ID, 任何填充標識符
- 錢:
1250.50→1250.5, 和2100.00→2100
最後一個值得坐在一起。 1250.50 和 1250.5 是相同的數字和不同的字串。如果您'正在渲染下游貨幣, $1250.5 將出現在 UI 中的某個地方,有人會提交一個錯誤,該錯誤需要一個小時才能追溯到三週前的 CSV 轉換。 (真正的教訓是將錢儲存為整數美分或十進制字串,而不是浮點數 - 但那'是為另一篇文章而戰。)
現在,在這個工具中,有 無需切換即可關閉推理。 底層函數採用 inferTypes 選項和 UI 從未傳遞它,所以它'永久開啟,預設值。 That'是一個間隙,它'是我該工具清單中的首要項目。
在它發貨之前,您的選擇是:
- 查看輸出。 說真的 - 這就是為什麼該工具在窗格中顯示 JSON 而不是僅僅下載它。掃描您的 ID 列。這需要十秒鐘,它'我該如何捕獲郵遞區號。
- 上游有報價證明。 CSV 中的引用獲勝't help - 解析器刪除引號和 然後 推論,所以
"07102"仍然成為7102. 相反,在來源處使值非數字:匯出為ZIP-07102,或在電子表格中新增前綴列。 - 後期處理。 轉換,然後修復您知道是標識符的列:
data.forEach(r => r.zip = String(r.zip).padStart(5, '0')). 醜陋,但誠實且可審計。 - 對真實管道使用真實解析器。 對於任何計劃或自動化的事情,
csv-parse或 Papa Parse 在 Node 中cast: false會正確地做到這一點。瀏覽器工具是一次性的。
解析器得到什麼正確?
I'一直很努力,所以這裡'是另一半 - 其中一些確實比你'在其他地方找到。
重複的標頭是一個嚴重的錯誤。 餵牠 a,b,a 它拒絕了: Duplicate headers found: a. 大多數解析器默默地讓最後一列獲勝,因此一列資料消失得無影無蹤。這裡大聲失敗是正確的呼叫 - 您不能在 JSON 物件中擁有兩個具有相同名稱的鍵,並假裝丟失資料。
引用的欄位處理正確,每 RFC 4180. 引號內的逗號保持不變; "" 成為字面意思 ". 樣本資料附帶 "Mike, Jr." 具體來說就是為了證明。
引用欄位內的換行符工作。 這就是手捲式 CSV 分裂通常死亡的地方 - 有人分裂 \n 多行位址欄位引爆整個檔案。行分割器逐個字元追蹤引用狀態字符,因此 "line1\nline2" 保持一個字段。
空白行被跳過,因此尾隨換行符和雜散的空行 Excel 在 don't 末端離開,產生幻象物件。
破爛的行 don't 崩潰。 字段太少,遺失的密鑰又回來了 null;太多且超出標頭計數的額外內容會默默刪除。 (最後一部分 I'調用有爭議而不是正確 - 警告比安靜丟棄更好。)
需要了解的一個 RFC 偏差: 值被修剪,包括內部引號。 RFC 4180 §2.4 表示空格是欄位的一部分,應該忽略 't 被忽略,所以 " John " 應該 " John ". 這個工具給你 "John". 那'這是一種刻意的便利 - CSV 中 99% 的尾隨空白時間都是您想要消失的事故 - 但如果您'是填充重要的往返數據,它'是一個有損步驟,規格不在我這邊。
為什麼贏得't 我的分號 CSV 解析?
因為介面只有逗號,這可以捕獲每個歐洲出口。
使用逗號作為小數點分隔符號的區域設定中的 Excel 寫入 CSV 分號 作為字段分隔符號。完全有效,極為常見,且該工具不會解析它。貼上 a;b 你會得到一把按字面命名的鑰匙 a;b 與價值 "1;2". 它沒有't錯誤-它只產生一個無用的列,這比出錯更糟。
解析函數接受a delimiter 選項。使用者介面永遠不會暴露它。與推理切換相同的間隙類別。
解決方法:
- 尋找並替換
;→,首先在文字編輯器中 - 安全 僅僅 如果沒有欄位在引號內包含逗號。 - 從 Excel 再匯出 與"CSV UTF-8(逗號分隔)"。
- 使用 CSV 檢視器 相反,它透過對候選分隔符號之間的列計數一致性進行評分來進行分隔符檢測,因此它將讀取您的分號檔案。它贏了't 轉換為 JSON,但是它'會向您展示您擁有的內容。
選項卡也有同樣的問題。管道分隔也是如此。
如何在 Toolz。dev 上將 CSV 轉換為 JSON?
步驟1:打開轉換器
去 CSV 到 JSON 轉換器. 範例資料已載入並已轉換,因此您可以立即看到形狀。
第 2 步:貼上您的 CSV
貼到左側窗格。那裡's 沒有文件上傳- it's 文字區域,所以打開你的 .csv 在文字編輯器中並複製它。對於 #39 的數千行;沒問題。對於 200 MB 匯出,請使用真正的解析器。
您的第一行必須是標頭,並且您至少需要一行資料。一行返回 CSV must have at least a header row and one data row.
第三步:轉換
擊 轉換為 JSON. 您會得到一個物件數組,每行一個,來自標頭的鍵,縮排兩個空格。行數出現在輸出上方 - 根據您的預期進行檢查,因為它'是最便宜的健全性測試。
第 4 步:在信任輸出之前先閱讀輸出
每個人都跳過這一步,我跳過一次。查看您的 ID 列。查看您的金錢列。如果郵遞區號在 JSON 中未引用,則 it' 現在是一個號碼。
第五步:複製或下載
仿造 對於剪貼簿, 下載json 對於a data.json 文件。
我什麼時候不應該使用瀏覽器轉換器?
誠實地對待邊界:
| 情況 | 使用 |
|---|---|
| 一次性的,幾千行 | csv 到 json |
| 您可以't 上傳敏感資料 | 這 - 它永遠不會離開您的瀏覽器 |
| 任何已安排或自動化的事情 | csv-parse /節點中的爸爸解析 |
| 分號或製表符分隔 | CSV 檢視器,或固定分隔符號 |
| 郵遞區號、SKU、填充 ID | 任何與 cast: false |
| 來自虛線標頭的嵌套輸出 | 腳本 - 僅產生平面物件 |
| 100k+ 行 | 串流解析器;瀏覽器將其全部保存在記憶體中 |
| 走另一條路 | json 到 csv |
那&引用;嵌套輸出&引用;行值得簡單說明,因為本指南的舊版本另有說明:標題類似 user.name 和 address.city 做 不是 成為嵌套物件。您會得到一個平面對象,其鍵名字為 "user.name". There'沒有點符號擴展,沒有標頭轉換,沒有 camelCase 轉換。平面物件、鍵與標頭行中鍵入的完全相同 - 空格、雜湊值和所有。的標頭 Order # 給你一把鑰匙 "Order #",這是合法的 JSON 和尷尬的 JavaScript (row["Order #"]).
使用此工具的原因與網站其他部分的原因相同:您的資料沒有'去任何地方。如果您'正在轉換包含真實姓名和電子郵件的客戶匯出,即'這不是一件小事 - 將其貼到伺服器端轉換器中意味著向第三方提供個人資料文件,這是與您的 DPO 的對話,您'寧願沒有。解析在您的選項卡中運行。關閉您的 Wi-Fi,它仍然可以工作。
常見問題
為什麼我的郵遞區號失去了前導零?
因為類型推斷將其轉換為數字,並且數字可以't 儲存前導零。 07102 匹配"僅數字"模式,所以它變成了 7102. 這會影響郵遞區號、填充的 SKU、員工 ID 以及任何恰好都是數字的識別碼。在 CSV won't help 中引用它 - 在推理運行之前刪除引號。檢查輸出中的 ID 列,或在來源處添加值前綴,使它們成為非數字。
我可以關閉自動類型轉換嗎?
不在介面中。底層函數支援a inferTypes 選項,但 UI 不暴露它,因此推理始終開啟。如果您需要原始字串,請使用 Papa Parse 等庫解析器 csv-parse 停用鑄造後,或在轉換後修復受影響的柱。
它支援分號或製表符分隔的檔案嗎?
不 - 介面僅是逗號。分號檔案解析為一個無義列而不是出錯,因此請注意這一點。首先將分號替換為逗號(僅在沒有引用欄位包含逗號時才安全),從 Excel 重新匯出為逗號分隔,或使用自動偵測分隔符號的 CSV Viewer。
空細胞會發生什麼事?
他們成為 null字串不是空的。請注意工具'擁有&引用;它是如何運作的&引用;面板目前顯示相反的內容 - 面板文字錯誤且程式碼正確。包含文字文字的儲存格 null 或者 nil 也成為 null.
我可以在沒有標頭行的情況下轉換 CSV 嗎?
不。第一行始終被視為標頭,只有一行的檔案會傳回一個錯誤,表示它需要一個標頭加上至少一個資料行。如果您的資料沒有標頭,請在貼上之前在文字編輯器中新增一個標頭。
它是否處理引用欄位內的逗號和換行符?
是的,兩者都是。解析器逐個字元追蹤引用狀態字符,因此字段類似 "Mike, Jr." 保留逗號,包含換行符的引用欄位保留單一值而不是分割行。轉義雙引號 ("") 根據 RFC 4180,成為單一文字引用。
重複的列名稱會發生什麼情況?
它拒絕轉換並告訴您哪個標頭被複製。 That's 故意 - JSON 物件可以't 有兩個相同的鍵,因此替代方案是默默地刪除一列。許多解析器正是這樣做的;重新命名列並再次轉換。
有行限制嗎?
沒有強制限制,但所有內容都在您的瀏覽器中運行'記憶體:CSV 文字、解析數組和格式化的 JSON 字串同時存在。幾千行很舒服;六位數的行數將使選項卡變得困難。對於這麼大的文件,請在 Node 中使用串流解析器。
我的數據是否上傳到任何地方?
不,解析發生在您的瀏覽器中,並且您的 CSV 永遠不會被傳輸,這使得客戶匯出和您無法合法貼上到伺服器端工具中的其他資料變得安全'合法地貼上到伺服器端工具中。以簡單的方式驗證它 - 打開 DevTools,在轉換時查看網路選項卡,或只是關閉 Wi-Fi 並查看它仍然有效。
簡短版本
CSV 到 JSON 看起來是計算中最無聊的轉換,它是 't,因為解析器決定字串的瞬間 意思是#39;t 宣布自己的方式可能是錯誤的。沒有錯誤,沒有警告,兩天後只有四位郵遞區號出現。
所以:那就轉換吧 讀取輸出. 檢查那些冒充數字的識別碼列。如果它們沒有被引用,you'失去了一些東西。這個習慣花了十秒鐘,本來可以幫我省下一封尷尬的電子郵件。
的 CSV 到 JSON 轉換器 擅長一次性工作 - 引用欄位、嵌入換行符、大整數 ID 以及重複標頭上的大聲故障,所有這些都無需您的資料離開瀏覽器。它'僅使用逗號,它總是推斷類型,並產生平面物件。現在你在這三個人咬之前就知道了。
走向另一個方向: json 到 csv. 首先檢查凌亂的 CSV: CSV 檢視器. 用於檢查輸出: json 格式化程式. 如果您的資料's 指向設定檔, JSON 到 YAML. 更廣泛的遊覽是在 JSON 工具指南 和 編碼工具指南.



