四つの変換方向と貼り付け入力,処理上限
このツールは,CSVまたはTSVからJSON,CSVまたはTSVからXML,JSONからCSVまたはTSV,XMLからCSVまたはTSVという四方向の変換を行います.「CSV ⇔ JSON/XML」はCSVとJSON,CSVとXMLの間を表しており,JSONからXML,XMLからJSONへ直接変換する機能ではありません.
画面の「変換の方向」で入力と出力の組合せを選び,「区切り文字」でカンマまたは実際のタブ文字を指定します.
入力方法はテキストエリアへの貼り付けまたは手入力です.ファイル選択,ドラッグ&ドロップ,複数ファイル処理,変換結果の自動ダウンロードには対応していません.サンプルボタンを押すと,選択中の方向と区切り文字に合わせた例が入力欄へ入ります.CSV/TSVの例では001のようなIDも含まれるため,型推定による値の違いを確認できます.
変換処理は入力全体を一度に読み,解析結果と出力文字列をJavaScriptのメモリ上で作る同期処理です.本ツール固有の上限として,入力は2,000,000文字,レコードは50,000件,列は200列,総セル数は1,000,000件,出力は5,000,000文字までにしています.
これはCSV,JSON,XMLの規格上の上限でも,すべての端末で軽快に動くことを保証する値でもありません.上限内でも端末の性能,空きメモリ,同時に開いているタブによって所要時間は変わります.超過した場合は変換を止め,入力を分割するようエラーで案内します.
CSVとTSVの引用符,改行,空白,列数検査
CSV/TSVの解析では入力を先頭から一文字ずつ読み,区切り文字,レコード区切り,二重引用符の状態を追跡します.カンマ区切りではカンマ,タブ区切りではU+0009のタブ文字を列境界として扱います.文字列の先頭にBOM由来のU+FEFFが一つある場合は解析前に取り除きますが,Shift_JISやUTF-16などの文字コードを判定・変換する機能ではありません.
貼り付ける前に,ブラウザで読める文字列になっている必要があります.
二重引用符で囲まれたセルの中では,選択中の区切り文字やCRLF,LF,CRをデータとして保持します.引用セル内で二重引用符を一文字として表す場合は,二つ続けた「""」を使います.セルの前後空白はデータの一部として残し,一律のtrim処理はしません.このため,空文字と半角空白だけの値は別の値です.
未閉じ引用符,値の途中から始まる不正な引用符,閉じ引用符の直後に区切りまたは改行以外の文字が続く状態を検出すると,対象レコード番号を付けて変換を停止します.
最初のレコードで決まった列数と,後続の全レコードの列数も比較します.列が足りない行を空文字で補ったり,余分な列を黙って捨てたりはせず,不一致をエラーにします.RFC 4180はCSVの代表的な記述方法をまとめたInformational RFCであり,本ツールも引用符や空白の考え方を参考にしています.
ただし,入力ではCRLFだけでなくLFとCRも受け付け,タブ区切りも別設定で扱うため,「RFC 4180完全準拠」や「あらゆるCSV方言に対応」という意味ではありません.JSON/XMLから作るCSV/TSVではレコード区切りをCRLFとし,区切り,引用符,改行を含む値を二重引用符で囲みます.
CSVからJSONへのヘッダーと保守的な型推定
「ヘッダー行を含める」がオンの場合,先頭レコードをJSONオブジェクトのキー名として扱い,2件目以降のレコードをオブジェクト配列へ変換します.ヘッダー値の前後に含まれる空白はトリミングされます.トリミング後に空文字列となるヘッダーや,同名の重複ヘッダーが存在する場合は,列の同一性喪失やプロパティ上書き事故を未然に防止するため例外エラーとなります.
一方,オフに設定した場合は先頭レコードも通常のデータ行として保持され,各行を配列とした二次元配列構造のJSONが組み立てられます.なお,空オブジェクトには__proto__やconstructorなどのプロトタイプ汚染が発生しないよう,nullプロトタイプの辞書を用いて安全にキーが割り当てられます.
CSV/TSVのテキスト規格自体には,セルごとのデータ型定義は存在しません.そのため「保守的な型推定」オプション(初期状態はオン)は,入力データの文脈を勝手に深読みするものではなく,限定的かつ厳格なJSON文法に合致するものだけを対象とした安全側の変換規則です.
オンの場合,前後の空白を含まない小文字のtrue,false,nullをそれぞれ真偽値およびnullリテラルへ変換します.数値については,JSONの文法に完全に合致する10進数値表記であり,JavaScriptエンジン内で有限の数値として扱える場合のみ数値型へと変換されます.
先頭に余分なゼロが付与された00123のような表記,InfinityやNaNなどの特殊値,0xFFといった16進数表記,および先頭に明示的な正符号+が付いた値は,すべて文字列のまま保持されます.また,値の周囲に半角空白が含まれるセルは,空白という文字データを損なわないために型推定を適用せず文字列として維持します.
整数であってもJavaScriptの安全整数範囲(Number.isSafeInteger)を超える値や,表記上の符号情報が失われやすい負のゼロ(-0)についても,数値化による値の変質を避けるため文字列として維持されます.
なお,10進小数の解釈においては,IEEE 754倍精度浮動小数点数の制限により,元の文字列が表す10進小数の厳密な辞書的表記精度がそのまま完全に保証されるわけではありません.郵便番号,会員番号,コード類,あるいは厳格な桁精度が不可欠な数値列を確実に文字列として残したい運用では,型推定をオフに設定してください.
オフにした場合は空セルを含めて全値が文字列型で統一出力されます.インデント幅は2スペースまたは4スペースから選択可能です.
JSONからCSV・TSVへ写す構造と欠損値
JSONから表へ変換する際は,単一オブジェクト,オブジェクト配列,行を表す配列の配列,単一のプリミティブ値,プリミティブ値の配列を区別します.単一オブジェクトとオブジェクト配列では,登場するトップレベルキーを初出順に集めてヘッダーにします.あるオブジェクトだけにキーが存在しない場合は,そのセルを空欄にします.
キーは存在するが値がnullの場合は文字列nullになるため,欠損キーの空欄とは区別されます.
オブジェクトの値がさらにオブジェクトや配列になっていても,ドット記法などで複数列へ展開しません.ネストした値をJSON文字列に直し,一つのセルへ格納します.たとえば配列[1,2]はセル内の「[1,2]」となり,CSVの引用規則に従って必要なら二重引用符で囲まれます.深いJSONを列へ展開したい場合は,関連ツールのJSON ⇔ CSV高機能フラット化コンバーターが別の用途になります.
行配列は最も長い行の列数に合わせ,短い行の末尾を空欄にします.プリミティブ配列は一行一値で出力します.一方,オブジェクト,配列,プリミティブが同じトップレベル配列に混在する場合は,一貫した行構造を決めずエラーにします.空配列,キーを一つも持たない空オブジェクトだけの表,列がない行配列も出力内容を決められないため停止します.
入力JSONはブラウザのJSON.parseで解析します.JSON構文として非常に大きな整数が書かれていても,JavaScriptのNumberとして読んだ時点で精度を失う場合があります.安全整数の上限は9,007,199,254,740,991です.本ツールは大整数専用パーサーやBigIntへの自動置換を行わないため,桁の保持が必要なIDや整数は入力JSON側で文字列にしておく必要があります.
CSVから作るXML名とXMLから表へ戻せる範囲
CSVやTSVからXMLを生成する場合,XML宣言に続いて単一のルート要素<root>が配置され,データ行ごとに<row>要素,その直下に各列を表現する子要素が出力されます.ヘッダーが存在しない場合はfield_1,field_2といった識別名が自動生成されます.
セル値内の&,<,>,二重引用符,単一引用符は適切にXML実体参照へエスケープ処理され,XML 1.0で許容されない制御文字や孤立サロゲートを検出した場合は不正な文書の生成を未然に遮断してエラーとなります.また,セル内の復帰改行(CR)は文字参照 として出力されるため,改行コードの規格通りの保持が図られます.
任意の表見出しがそのまま合法なXML要素名として通用するとは限りません.本機能では,Unicode文字・数字・一部の記号(ハイフン,アンダースコア,ピリオド)を許容する安全な文字規則に沿ってヘッダー文字列を正規化し,不正な記号や空白文字はアンダースコアへ置き換えます.
先頭が数字などで始まる場合や大文字小文字を問わずxml接頭辞で始まる場合は先頭にfield_が付与され,空文字ヘッダーもfield_連番へと補正されます.重複が生じた場合は連番サフィックス(_2など)により一意化されるため,元のCSVヘッダー名との完全な双方向ラウンドトリップは保証されません.
XMLからCSV/TSVへ復元できる対象は,ルート要素の直下に行要素が並び,その行要素の直下にテキストのみを持つ列要素が平坦に並ぶシンプルなテーブル構造に限定されます.属性値,名前空間宣言,列要素のさらなる入れ子構造,同一行内での同名列要素の重複,および要素間での混合コンテンツ(mixed content)が含まれるXMLは,二次元表への縮退によって構造情報を喪失するため拒否されます.
また,DOCTYPE宣言,コメント,処理命令(PI),異なる行要素名の混在も構文検証段階で排除されます.
行要素や列要素の間に存在するテキストのうち,ASCII XML空白のみで構成されかつ改行を含むものだけが表構造のマッピング慣例として省略されます.一方で,改行を含まない空白(単一の半角スペースなど),非空白テキスト,および構造上のCDATAセクションは構文エラーとして拒否されます.
末端の列要素内に含まれるテキストノードやCDATAノードは連結されて単一の値となりますが,その境界情報は失われます.行ごとに列の構成が異なる場合は最初に出現した順序に基づく和集合としてヘッダーが構築され,未定義のセルは空セルとして埋められます.このため欠損列と空要素の差異は同一の空セルへと縮退し,列の出現順序も元の要素順から再編される場合があります.
結果コピー,同期処理,データ取扱いの確認点
変換処理によって得られた結果テキストは出力欄に表示され,「結果をコピー」ボタンを押すことでブラウザのClipboard API経由でクリップボードへ渡されます.クリップボードへの書き込みは非同期の完了を待ち合わせ,正常に書き込めた場合のみ成功表示へと遷移します.
ブラウザのアクセス許可ポリシーや実行コンテキストの制限によって書き込みが拒否された場合は,エラー表示とともに手動選択によるコピーを促す案内が行われます.また,入力欄の変更,区切り文字・ヘッダー・型推定・インデントなどの設定変更,あるいはサンプル読み込みが行われた瞬間,以前の出力結果や完了表示は直ちにクリアされ,世代不整合な結果の誤コピーを防止します.
テキストのパースおよび変換処理は,外部サーバーへペイロードを送信することなく,ブラウザのメインスレッド上のJavaScriptによって同期的に実行されます.ただし,Webサイト全体としては静的アセット配信やアクセス解析,広告等の外部通信が分離して存在するため,端末や通信環境全体を含めた「完全オフライン」「絶対的な無通信・情報漏えい皆無」といった過剰な安全性を保証するものではありません.
機密データを扱う際は,所属組織のセキュリティ基準やブラウザ拡張機能の影響を十分にご確認ください.
また,本処理はWeb Workerやストリーム処理,非同期チャンク分割を用いない一括変換です.入力文字数は200万コードユニット,行数はヘッダーを含めて最大5万レコード,列数は最大200列,総セル数は100万セル,出力文字数は500万コードユニットを上限として制限されています.
上限に近い巨大なテキストを一括処理する場合,メインスレッドの占有によってブラウザの画面描画や操作応答が一過性に一時停止することがあります.
さらに,出力されたCSVやTSVをExcel等の表計算ソフトで開く場合,先頭が=,+,-,@等で始まる危険な文字列が数式として自動実行される数式インジェクションのリスクが存在します.本コンポーネントは出力値の数式無害化(先頭へのアポストロフィ付与等)を強制しないため,外部連携前に必ず内容を精査してください.スキーマ検証やファイルダウンロード,API通信への統合などは利用側で管理する必要があります.