CSVからYAMLへ
このコンバーターはRFC 4180のCSVファイルをYAMLのマッピングのシーケンスに変換し、すべてをブラウザ内で処理します。列ヘッダーがキーにマッピングされ、ドットまたは角括弧付きのヘッダーが構造化されたYAMLにネストされます。最初の行がキー名を提供し、クォートは各形式のルールに従い、アップロードは一切行いません。
CSVからYAMLへとは
CSVファイルはグリッドであり、YAMLファイルはツリーです。その間を繋ぐのはヘッダー行です:すべての列名は、それが記述するレコードへのパスとして読み取られます。roleのようなプレーンなヘッダーはプレーンなキーになり、address.cityは内部にcityキーを持つaddressマッピングを構築し、tags[0]はリストを構築します――これはサイトのYAMLからCSVコンバーターが使用するのと同じ列パス規約を逆方向に読んだものです。マッピングが明示的かつ逆可能であるため、CSVからYAMLへ、そして戻るファイルは変更されずに到達します。
CSV側はRFC 4180として解析されます:カンマ区切り、フィールドにカンマ、クォート、または改行が含まれる場合の二重クォートエスケープ、および複数行にまたがる可能性のあるクォート付きフィールド。区切り文字はヘッダー行から推測されます――カンマ、セミコロン、タブ、またはパイプ――ただし、クォートされた領域の外側のみをカウントするため、説明内のセミコロンが推測を妨げることはありません。型推論は意図的に狭いです:JSON数値文法に一致する値のみが数値になり、これにより02134のような郵便番号が先頭のゼロを保ったまま生存します。
すべてがこのブラウザのタブ内で動作します。貼り付けたCSVテキストはページ内のエンジンによって解析され、YAMLは解析されたレコードから出力されます。どちらもネットワークに触れることはありません――DevToolsを開き、ネットワークパネルが静まっている様子を確認し、その主張が自己検証されるのを見てください。
ラウンドトリップはまた、最も速い正確性チェックでもあり、YAMLからCSVコンバーター同じ列パスを使用してYAMLからグリッドを再構築します。
もしこれでも頑ななエクスポートが期待通りに解析されない場合、RFC 4180 フィールドガイドクォート、CRLF、および実際のスプレッドシートファイルが含む偏差について説明しています。
変換は実際にどのように機能するか
エンジンはグリッドを一度読み取り、その後は生テキストを再び見ることはありません――その後のすべての決定は解析されたレコードに対して行われます。その順序こそがルールを合成可能に保つものです:ヘッダーパスは型推論の前に展開され、型推論はYAMLエミッターが何をクォートする必要があるかを決定する前に実行されます。
- 解析:小さな状態機械がテキストをフィールドに分割し、二重クォートとクォートされたフィールド内の改行を尊重し、先頭にバイトオーダーマークがあればそれを削除します。
- 名前付け:最初の行が列名になり、空のヘッダーセルはcolumn1、column2などにフォールバックします。
- 展開:各ヘッダーがパスとしてデコードされます――ドットがマッピングキーを区切り、角括弧が配列インデックスをマーク――そしてすべての行がネストされたレコードとして再構築されます。
- 出力:レコードはYAMLシーケンスとしてシリアライズされ、インデントはスペース2つ、値はプレーンな形式が誤って読み取られる場合のみクォートされます。
ヘッダー名の意味
ヘッダーはグリッドが構造を表現できる唯一の場所であるため、それらは不透明なラベルとしてではなくパスとして読み取られます。ドットと角括弧は異なる役割を果たし、その違いこそがマッピングを逆可能にするものです:ドットは常にマッピングキーを意味し、角括弧は常に配列インデックスを意味するため、tags[0]はリストを構築しますが、tags.0は文字列キー「0」を持つマッピングを構築します。2つを同等に扱うコンバーターは推測することになり、その推測は半分の時間で間違うことになります。
| ヘッダー行 | 生成されるYAML |
|---|---|
| address.city | 内部にcityキーを持つaddressマッピング |
| tags[0], tags[1] | その2つの要素を持つtagsリスト |
| tags.0 | 文字列キー「0」を持つtagsマッピング――リストではない |
| role | すべてのレコードにあるプレーンなroleキー |
セル、型、および空のフィールド
型推論はYAMLを有用にするために存在しますが、その制限は厳しくされています。セルはJSON数値文法に一致する場合のみ数値となり――これは先頭のゼロを禁止します――そしてtrue、false、nullはそれらの正確な小文字の綴りの場合のみとなります。それ以外すべては文字列のままです。FALSE、+1、0x10、安全範囲より長い整数などは含みます。浮動小数数が桁を静かに落とす可能性があるためです。空のセルは空の値ではなく欠落したフィールドとして扱われます。なぜならCSVは2つを区別できず、欠落した読み取りがスパースな行がほとんどの場合意味するものだからです。
- 02134は文字列「02134」のままです;90210は数値90210になります。
- trueとfalseはブール値になります;大文字のFALSEは文字列のままです。
- 埋め込み改行を持つセルはYAMLブロックリテラルになり、行構造が生存します。
- 数値として再読み取りされる可能性のある値はクォート付きで出力され、これがラウンドトリップを損失なしに保つものです。
このコンバーターが推測を拒む場所
失敗はサイレントな再形成を伴うことなく、行番号と理由とともに報告されます。サイレントな再形成はデータツールが回復できない唯一の失敗だからです。3つの状況が正確にその扱いを受けます:
- 終了していないクォート付きフィールド――二重クォートが開いて閉じられていない――はその行で解析を中止します。
- フィールド数がヘッダーと異なる行は変換されますが、警告は影響を受ける行を名指しし、欠落したフィールドは absent として扱われ、余分なフィールドはドロップされることを述べます。
- 重複した列名は右端の値が優先して変換され、警告はそれを述べます――スプレッドシートのインポートの動作と一致します。
よくある質問
CSVからYAMLへの変換でファイルがどこかにアップロードされますか?
いいえ。解析とYAML生成の両方が、ページが開かれたときに一度読み込まれたJavaScriptを使用して、このブラウザのタブ内で実行されます。データを送信するAPIルートはなく、ページのContent-Security-Policyはconnect-src 'self'に設定されているため、ブラウザ自体があらゆる発信リクエストを拒否します。両方の主張をDevToolsで確認できます:変換時にネットワークパネルにリクエストは表示されません。
CSVのヘッダーがネストされたYAMLキーになるのはどうしてですか?
各ヘッダーはパスとしてデコードされます:ドットがマッピングキーを区切り、角括弧が配列インデックスをマークするため、address.cityはaddressキーの下にネストされますが、tags[0]はリストを構築します。角括弧形式は装飾ではありません――tags.0は代わりに文字列キー「0」を持つマッピングを作成しますなぜなら、裸のドットでは次のレベルがリストかオブジェクトかを言うことができないからです。2つの綴りを区別し続けることがこの規約を逆可能にするものです。
セル内の数値と郵便番号はどうなりますか?
セルはJSON数値文法に一致する場合のみ数値となり、これは先頭のゼロを禁止します――そのため02134は文字列のままですが、90210は数値になります。安全範囲を超える整数も、桁が失われる代わりに文字列のままです。ブール値には正確な小文字の綴りtrueとfalseが必要であり、nullも同様です;大文字のFALSEは、それが見えるままの文字列のままです。
なぜ空のセルはYAML出力から消えますか?
空のセルは空の値ではなく、欠落したキーとして出力されます。CSVは、 genuinely empty なフィールドと、単に行が持っていないフィールドを区別する方法がなく、そして欠落した読み取りが実際に発生するスパースなケース――最も広い行より短いレコード――に一致します。もし下流のコンシューマーがキーの存在を必要とする場合、明示的なクォート付きの空セルがそれを要求する方法です。
YAML出力はどのようなインデントスタイルを使用しますか?
レベルごとにスペース2つ、Kubernetes、CI、Dockerファイル全体で使用される規約で、シーケンスのダッシュは親キーに揃えられ、その下にインデントされません。複数行のセルは埋め込み改行がそのまま生存するようにブロックリタラルになり、ドキュメントは先頭に---マーカーなしで出力されますなぜなら単一ドキュメントのファイルにはそれが必要ないからです。
どのくらい大きなCSVファイルを処理できますか?
実際の制限はこのタブのメモリ容量で、アップロード上限ではありません――入力はペーストボックスです。このサイトのすべてのメインスレッドツールと同様に、文書化された8 MBの上限があります;それを超えると、ページをフリーズさせる代わりに明確なメッセージで処理が拒否されます。典型的なタブラーエクスポートの場合、その余裕は数万行になります。