クライアントから、ステージング データベースにロードするために 12,000 行の顧客エクスポートが送られてきました。 変換して、輸入して出荷しました。 2 日後、彼らの OP リーダーは、ニュージャージー州の数百人の顧客が 4 桁の郵便番号を持っている理由を尋ねました。
07102 になっていました 7102ゼロから始まるすべてのジッパーは ファイル全体にわたって 静かに切断されています バグによるのではなく - 機能によるのです 型推論が調べました 07102、「数」に一致するものを見て、それを 1 つに変換しました。 ゼロを先導することは、数字が持つものではありません。
を作りました CSV から JSON へのコンバータ Toolz.dev で、これも実行します。 データを静かに変更するコンバーターは、失敗したコンバーターよりも危険なため、正確な場所をお見せします。
tl;dr: ザ・ CSV から JSON へのコンバータ CSV を、最初の行をキーとして使用して、すべてのオブジェクトの配列に変え、ブラウザーで完全に実行します。 それは 常にタイプを推測する そして、あなたはすることができます& #39; t UIでそれをオフに切り替える - つまり
07102→7102、1250.50→1250.5、空のセル →null、そしてtrue/false→ブール値。 2⁵³ を超える大きな整数は、Twitter ID を保存する文字列を維持します。 カンマのみ インターフェイスでは、そうヨーロッパのexcelのセミコロンcsvs won& #39; t parse. duplicateヘッダーは、サイレント上書きではなく、ハードエラーです - その1& #39; s ほとんどのパーサーよりも本物の改善をインポートする前に出力をチェックし、を使用します 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" |
ひも |
パターンが明らかでないため、これらのいくつかは詳しく見てみる必要があります。
正規表現は厳密で、耐荷重性があります。 似てる ^-?\d+$ そして、他には何もありません。 それがなぜ +5 あんど .5 文字列として生き残る - 先頭のプラスなし、裸の小数点なし。 It' sなぜですか +8801712345678- バングラデシュの電話番号、そして私は私の電話番号でテストします - 無傷で届きます。それを剥ぎ取ります + そして、数値変換でそれを失うことになります。 したがって、正規表現の厳格さは誤って電話番号を保護しており、国コードを維持した電話番号のみを保護しています。
大きな整数が正しく処理され、驚いた。 JavaScript の安全な整数範囲 (±2⁵³−1) 以外はすべて、変換して、マングリングするのではなく、意図的に文字列として保持されます。 Snowflake ID、Twitter ID、および 19 桁のデータベース キーは存続します。 ほとんどのナイーブ コンバーターが呼び出す parseInt そしてあなたに手渡す 9007199254740992 あなたが持っていた場所 ...93。 これは最初に境界をチェックします。
NO 文字列のままー YAMLファイルを食べるノルウェーの問題を静かに回避します 異なる形式、異なるパーサーですが、注目に値します: 国コード NO は、構成パーサーがそれをどのように扱うかを説明するコイン フリップであり、ここでは安全です。
空は null を意味し、空の文字列ではありません。 これは、これを書いている小さなドキュメントのバグです。ツールは、「どのように機能するか」と言うものです。 「空の値は、JSON 出力では空の文字列として保持されます。」 彼らはそうではありません。 inferType('') 返品 null。 UI テキストが間違っています。コードは出荷するものです。 コピーを修正しています。
07102 が 7102 になるのはなぜですか? また、どうすればよいですか?
郵便番号は数字ではなく、コンピューターはわかりません。
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に現れることになり、誰かが3 週間前のCSV変換まで遡って1 時間かかるバグをファイルする。 (そこでの本当の教訓は、お金を整数セントまたは10 進数の文字列として保存することであり、決してフロートではない - しかし、that' sは別の記事のための戦いです。)
現在、このツールには、 推論をオフにするための切り替えはありません。 基礎となる関数は、 inferTypes オプションと UI は決してそれを渡さないので、デフォルトで永続的にオンになります。 それはギャップであり、このツールの私のリストの一番上のアイテムです。
出荷されるまで、次のオプションがあります。
- 出力を見てください。 真剣に - これが、ツールが JSON をダウンロードするだけではなく、ペインに表示する理由です。ID 列をスキャンします。所要時間は 10 秒です。it's 郵便番号を取得するにはどうすればよいですか。
- 上流で見積もりに耐えます。 CSV での引用は勝ち'助け - パーサーは引用符と をストリップします そしたら 推測するので、
"07102"まだなる7102。 代わりに、ソースで値を非数値にします: としてエクスポートしますZIP-07102または、スプレッドシートにプレフィックス列を追加します。 - 後処理。 変換してから、識別子であることがわかっている列を修正します。
data.forEach(r => r.zip = String(r.zip).padStart(5, '0'))。 醜いですが、正直で監査可能です。 - 実際のパイプラインには、実際のパーサーを使用してください。 予定されているものや自動化されたものについては、
csv-parseまたはノード内の papa パースcast: falseこれをきちんと行います。 ブラウザ ツールは 1 回限りのものです。
パーサーは何を正しくしますか?
私は& #39;大変でしたので、こちらと #39;残りの半分は - そして、この一部はあなたや #39;他の場所で見つけたものよりも本当に優れています。
ヘッダーの重複は、ハード エラーです。 フィード・イット a,b,a そしてそれは拒否します: Duplicate headers found: a.ほとんどのパーサーは静かに最後の列を勝たせるので、データの列は単語なしで消える。ここで大声で失敗するのは正しい呼び出しである - JSON オブジェクトに同じ名前の 2 つのキーを持つことはできず、そうでないふりをするとデータが失われる。
引用されたフィールドは正しく処理されます、 あたり RFC 4180。 引用符内のコンマは置かれたまま; "" 文字通りになる "。 サンプル データは、 "Mike, Jr." 具体的には証明する。
引用符で囲まれたフィールド内の改行は機能します。 これは、手巻き CSV 分割が通常死ぬ場所です - 誰かが分割します \n 複数行のアドレス フィールドがファイル全体を起爆します。 行分割は、状態文字を引用符で囲みます。 "line1\nline2" 1 つのフィールドにとどまります。
空白行はスキップされますというわけで、末尾の改行と、最後にある迷いのない行 Excel の葉は、ファントム オブジェクトを生成しません。
ぼろぼろの列はクラッシュしません。 フィールドが少なすぎて、キーが戻ってこない null; あまりにも多くのとあなたのヘッダーカウントを過ぎて余分なものが静かにドロップされます。 (その最後の部分I& #39; dコール議論可能ではなく、正しい - 警告は静かな破棄よりも良いでしょう。)
1 つの RFC 偏差について知っておくべきこと: 内部引用符を含む値がトリミングされます。 RFC 4180 §2.4 は、スペースはフィールドの一部であり、無視されるべきではないとのことです。 " John " はず " John "。 このツールはあなたに与えます "John". それと#39; s は意図的な利便性です - CSV で空白を追跡する時間の 99% は、消えてほしい事故です - しかし、もしあなたが & #39; パディングが重要なラウンドトリッピング データである場合、それは & #39; s は損失の多いステップであり、仕様は私の味方ではありません。
セミコロン CSV が解析できないのはなぜですか?
インターフェイスはカンマのみであり、これはすべてのヨーロッパのエクスポートをキャッチするためです。
小数点記号としてコンマを使用するロケールで Excel が CSV を書き込む セミコロン フィールド区切り文字として。 完全に有効で、非常に一般的で、このツールは解析しません。 貼って a;b そして、文字通り名前の 1 つのキーを取得します a;b 値で "1;2"。それは'エラーではありません。無駄な列が 1 つ生成されるだけで、エラーよりも悪いです。
解析関数は、 delimiter オプション。 UI は決してそれを公開しません。 推論と同じクラスのギャップ。
回避策:
- 検索と交換
;→,最初にテキストエディタで - 安全です だけ フィールドにカンマの引用符が含まれていない場合。 - 再 -Excel からエクスポート 「CSV UTF-8 (カンマ区切り)」を使用します。
- を使用する CSVビューア 代わりに、候補区切り文字間で列カウントの一貫性をスコアリングすることで区切り文字の検出を行うため、セミコロン ファイルが読み取られます。勝った't JSON に変換しますが、it'll はあなたが持っているものを表示します。
タブにも同じ問題があります。 パイプ区切りも同様です。
ツールズ.dev で CSV を JSON に変換するにはどうすればよいですか?
ステップ 1: コンバーターを開く
に行く CSV から JSON へのコンバータ。 サンプル データがロードされ、変換済みであるため、すぐに形状を確認できます。
ステップ 2: CSV を貼り付ける
左ペインに貼り付けます。 あります ファイルのアップロードはありません- it' s テキストエリアなので、開きます .csv テキスト エディタでコピーします。 数千行でも大丈夫です。 200 MB のエクスポートには、実際のパーサーを使用します。
最初の行はヘッダーである必要があり、少なくとも 1 つのデータ行が必要です。 1 行が戻る CSV must have at least a header row and one data row。
ステップ 3: 変換する
たえます JSON に変換する。, オブジェクトの配列を取得します。, 行ごとに 1 つ, ヘッダーからキー, インデントされた 2 つのスペース. 行カウントは、出力の上に表示されます - 期待したものと照合します。, it' s 可能な限り安価な正気度テスト以来。
ステップ 4: 出力を信頼する前に読み取る
ステップはみんなスキップして、私は一度スキップしました。 ID 列を見てください。 あなたのお金の列を見てください。 JSON で引用符なしの郵便番号が表示された場合、それは今の数字です。
ステップ 5: コピーまたはダウンロード
コピーして クリップボードについては、 jsonをダウンロード のために data.json ファイル。
ブラウザ コンバーターを使用しないのはいつですか?
境界について正直であること:
| 状況 | 使い |
|---|---|
| 一回限り、数千行 | CSVからJSONへ |
| アップロードできない機密データ | これは - それはあなたのブラウザから離れることはありません |
| 予定されているか自動化されているもの | csv-parse / ノード内の papa パース |
| セミコロンまたはタブ区切り | CSVビューア、または区切り文字を修正します |
| 郵便番号、SKU、埋め込み ID | となんでも cast: false |
| ドット付きヘッダーからのネスト出力 | スクリプト - これはフラット オブジェクトのみを生成します |
| 100k+ 行 | ストリーミング パーサー; ブラウザはすべてをメモリに保持します |
| 逆方向に行く | JSONからCSVへ |
このガイドの古いバージョンでは別のバージョンが主張されているため、「ネストされた出力」行は、その行に明白に述べる価値があります。 user.name あんど address.city する でないよ ネストされたオブジェクトになります。 文字通り名前のキーを持つフラット オブジェクトを取得します "user.name"。 There' s no dot-notation expansion, no header transformation, no camelCase conversion.フラットオブジェクト、ヘッダー行に入力されたとおりのキー - スペース、ハッシュ、およびすべてのヘッダー Order # あなたに鍵を渡す "Order #"合法的な JSON と厄介な JavaScript (row["Order #"].
このツールのために到達する理由は、サイトの残りの部分と同じ理由: あなたのデータはdoes& #39; どこにも行かない. if you& #39; reコンバート実名や電子メール内の顧客のエクスポート, that& #39; s小さなものではありません - サーバー側のコンバータに貼り付けることは、個人データのファイルを第三者に渡すことを意味, これは、あなたのDPOとの会話you& #39; むしろ持っていない. ここで解析は、タブで実行されます. Wi-Fiをオフにし、それはまだ動作します。
よくある質問
郵便番号が先行ゼロを失ったのはなぜですか?
型推論はそれを数値に変換し、数値は先行ゼロを格納できないためです。 07102 「数字のみ」のパターンに一致するため、 7102。, 郵便番号に影響します。, パッド付きSKU, 従業員ID, そして、すべての数字であることが起こる任意の識別子.CSVでそれを引用won& #39; tヘルプ - 引用符は、推論が実行される前に剥奪されます.出力内のID列をチェック, またはソースで値を接頭辞として非数値にします。
自動型変換をオフにすることはできますか?
インターフェイスにはありません。 基礎となる関数は、 inferTypes オプションですが、UI は公開していないため、推論は常にオンになっています。 生の文字列が必要な場合は、papa のようなライブラリ パーサーを使用するか、 csv-parse キャストを無効にするか、変換後に影響を受ける列を修正します。
セミコロンまたはタブ区切りファイルをサポートしていますか?
いいえ - インターフェイスはカンマのみです。セミコロン ファイルはエラーではなく 1 つのナンセンス列に解析されるため、注意してください。セミコロンを最初にカンマに置き換えます (引用符で囲まれたフィールドにカンマが含まれていない場合にのみ安全です)。カンマ区切りとして Excel から再エクスポートするか、区切り文字を自動的に検出する CSV ビューアを使用します。
空のセルはどうなりますか?
彼らはなる null、空の文字列ではありません。 tool& #39; s own " How it works" panelは現在反対のことを言っています - パネルのテキストは間違っており、コードは正しいです。 cells containing the literal text null や nil またなる null。
ヘッダー行なしで CSV を変換できますか?
いやー 。 最初の行は常にヘッダーとして扱われ、1 行だけのファイルは、ヘッダーと少なくとも 1 つのデータ行が必要であるというエラーを返します。 データにヘッダーがない場合は、貼り付ける前にテキスト エディタに 1 つ追加します。
引用符で囲まれたフィールド内のコンマと改行を処理しますか?
そう、両方。 パーサーは、状態の文字ごとに引用符を追跡するので、次のようなフィールド "Mike, Jr." カンマを保持し、改行を含む引用符で囲まれたフィールドは、行を分割するのではなく、1 つの値のままにします。 エスケープされた二重引用符 ("") RFC 4180 によると、単一の文字通りの引用になります。
重複する列名はどうなりますか?
変換を拒否して、どのヘッダが複製されているかを教えてくれます That's deliberate - a JSON object can't have two identical keys, so the alternative is silently droping a column.多くのパーサーは、まさにそれを行います; 列の名前を変更して、再度変換します。
行数制限はありますか?
制限はありませんが、すべてがブラウザーのメモリーで実行されます: CSV テキスト、解析済み配列、およびフォーマットされた JSON 文字列はすべて一度に存在します。 数千行で快適です。6 桁の行数を数えると、タブが苦戦します。 大きいファイルの場合は、代わりにノードでストリーミング パーサーを使用します。
私のデータはどこかにアップロードされていますか?
いいえ 解析はブラウザで起こり、あなたのCSVは決して送信されません, それはあなたができた顧客エクスポートや他のデータのためにそれを安全に作るものです& #39; tは合法的にサーバー側のツールに貼り付ける簡単な方法で検証します - DevToolsを開きます, 変換中にネットワークタブを見ます, またはちょうどあなたのWi-Fiをオフにし、それがまだ動作することを確認します.
短いバージョン
CSV から JSON への変換は、コンピューティングで最も退屈な変換のように見えますが、パーサーが文字列を決定する瞬間に、そうではありません。 平均、それは自分自身を発表しない方法で間違っている可能性があります。 エラーも警告もありません。2 日後に 4 桁の郵便番号が表示されるだけです。
それで、変換してから 出力を読む。 数字のふりをしている識別子である列をチェックしてください。 引用されていない場合、何かを失ったことになります。 その習慣は 10 秒かかり、恥ずかしいメールを救えたでしょう。
ザ・ CSV から JSON へのコンバータ は、1 回限りのジョブ - 引用フィールド、埋め込み改行、大整数 ID、重複ヘッダーでの大音量の失敗、すべてブラウザからデータを離れることなく、得意です。 It' s コンマのみ、常に型を推測し、フラット オブジェクトを生成します。噛む前に 3 つすべてがわかるようになりました。
別の方向に行く: JSONからCSVへ。 厄介な CSV を最初に検査するには、次の手順を実行します。 CSVビューア。 出力を確認するには: JSON フォーマッタ。 データが設定ファイルに向かう場合は、 JSON から YAML へ。 より広いツアーは、 JSON ツール ガイド そして、 コーディング ツール ガイド。



