CSV ピボット・逆ピボット
データ変換
読み込み中
ツールを読み込んでいます
ツールのコードは開いたときにのみ読み込まれます。
このツールの処理はすべてブラウザー内で行われ、入力内容はサーバーへ送信されません。
このツールについて
取引明細を地域別・月別の集計表にしたり、月別のワイド形式を識別子・変数名・値からなるロング形式に変換したりできます。ピボットでは複数の行キー、1つの列キー、複数の値列と集計方法を明示的に選びます。逆ピボットでは識別子列を保持し、選択した値を解析後の元の文字列としてコピーします。同じピボット座標の行は集計され、前の値が黙って上書きされることはありません。正確な十進演算で二進浮動小数点の誤差を避け、非対応の数値表記はエラーにし、循環小数になる平均は丸めず 1/3 のような正確な既約分数の文字列で返します。解析、変換、ダウンロードはブラウザー内のローカルワーカーで実行します。
主な用途
- 売上明細を地域と製品でまとめ、月を列に展開して、選択した金額列と数量列の正確な合計を求める。
- 001、1、大文字小文字を区別する部署コードを変更せず、同じ分類に属する空でない値の件数を数える。
- Jan、Feb、Mar 列を変数名・値のロング形式に変換し、口座 ID、空セル、元の小数表記を保ったまま別の集計システムに渡す。
使い方
- 1.CSV テキストを貼り付けるかローカルファイルを選び、区切り文字、ヘッダー、対応する文字コードを設定して列を読み取ります。ピボットでは必要に応じて行キーを選び、1つの列キー、1つ以上の値列と集計方法を指定します。列の役割は重複できません。逆ピボットでは残す識別子列と展開する値列を選び、変数名列と値列の出力名を指定します。
- 2.実行前に選択した列を確認します。キーは文字列の完全一致で、空白の除去、大文字小文字の統一、数値変換は行いません。数値集計は説明にある十進形式だけを受け付けます。逆ピボットは空値と欠損値を既定で保持します。存在する空文字列を意図的に捨てる場合だけ空値の除外を選んでください。欠損の null は残ります。入力や設定を変更すると以前の結果は無効になります。
- 3.変換を実行し、行列数とページ分割された結果を確認して JSON または CSV をダウンロードします。分類値や元のヘッダーに記号が含まれる場合は出力列のメタデータを確認してください。JSON は欠損の null と空文字列を区別し、文字列の ID を保持します。表計算ソフトで確認する CSV では数式対策を有効にし、元の CSV は信頼できる用途でのみ明示的に選んでください。ページ分割や表示の省略は正常に生成された完全な出力を切り詰めません。
ピボット・逆ピボットの変換前後の実例
地域と製品で正確な売上合計をピボット
{
"input": "region,product,month,amount,units\nNorth,001,Jan,0.10,2\nNorth,001,Jan,0.20,3\nNorth,001,Feb,1.50,1\nSouth,001,Jan,4,2\nNorth,1,Jan,2,1",
"parseOptions": {
"delimiter": ",",
"header": true
},
"options": {
"mode": "pivot",
"rowKeys": [
"region",
"product"
],
"columnKey": "month",
"valueColumns": [
"amount",
"units"
],
"aggregation": "sum"
}
}{
"headers": [
"region",
"product",
"pivot:[\"Jan\",\"amount\",\"sum\"]",
"pivot:[\"Jan\",\"units\",\"sum\"]",
"pivot:[\"Feb\",\"amount\",\"sum\"]",
"pivot:[\"Feb\",\"units\",\"sum\"]"
],
"rows": [
[
"North",
"001",
"0.3",
"5",
"1.5",
"1"
],
[
"South",
"001",
"4",
"2",
null,
null
],
[
"North",
"1",
"2",
"1",
null,
null
]
]
}変換前では North/001/Jan が2回現れるため、0.10 + 0.20 は正確な文字列 0.3、2 + 3 は 5 になります。月は最初に現れた順で、各月に amount、units の順で列を作ります。North/001 と North/1 は別グループのままです。観測のない地域・製品・月の組み合わせは null です。
テキストを含めて空でない値を数える
{
"input": "id,month,value\nA,Jan,yes\nA,Jan,\nA,Jan\nA,Feb,0\nB,Jan,",
"parseOptions": {
"delimiter": ",",
"header": true
},
"options": {
"mode": "pivot",
"rowKeys": [
"id"
],
"columnKey": "month",
"valueColumns": [
"value"
],
"aggregation": "count"
}
}{
"headers": [
"id",
"pivot:[\"Jan\",\"value\",\"count\"]",
"pivot:[\"Feb\",\"value\",\"count\"]"
],
"rows": [
[
"A",
"1",
"1"
],
[
"B",
"0",
null
]
]
}A/Jan は yes を数え、空フィールドと欠損は飛ばします。A/Feb は文字 0 を数えます。B/Jan には元の座標がありますが空でない観測がないため "0"、B/Feb には元の座標がないため null です。異なる値の数や全入力行数ではありません。
有限小数になる平均を正確に計算
{
"input": "id,month,value\nA,Jan,0.1\nA,Jan,0.2\nB,Jan,0.125\nB,Jan,0.375",
"parseOptions": {
"delimiter": ",",
"header": true
},
"options": {
"mode": "pivot",
"rowKeys": [
"id"
],
"columnKey": "month",
"valueColumns": [
"value"
],
"aggregation": "avg"
}
}{
"headers": [
"id",
"pivot:[\"Jan\",\"value\",\"avg\"]"
],
"rows": [
[
"A",
"0.15"
],
[
"B",
"0.25"
]
]
}A の (0.1 + 0.2) / 2 は正確に 0.15、B の (0.125 + 0.375) / 2 は正確に 0.25 です。結果は十進文字列で、二進浮動小数点の近似は入りません。
負数を含む値から数値の最小値を求める
{
"input": "id,month,value\nA,Jan,-3.20\nA,Jan,7.50\nA,Jan,-0.00",
"parseOptions": {
"delimiter": ",",
"header": true
},
"options": {
"mode": "pivot",
"rowKeys": [
"id"
],
"columnKey": "month",
"valueColumns": [
"value"
],
"aggregation": "min"
}
}{
"headers": [
"id",
"pivot:[\"Jan\",\"value\",\"min\"]"
],
"rows": [
[
"A",
"-3.2"
]
]
}-3.20、7.50、-0.00 の数値の最小値は -3.2 です。集計では小数表記を正規化し、文字列の並び順ではなく正確な数値として比較します。
JavaScript の安全な整数範囲を超える最大値
{
"input": "id,month,value\nA,Jan,9007199254740992\nA,Jan,9007199254740993",
"parseOptions": {
"delimiter": ",",
"header": true
},
"options": {
"mode": "pivot",
"rowKeys": [
"id"
],
"columnKey": "month",
"valueColumns": [
"value"
],
"aggregation": "max"
}
}{
"headers": [
"id",
"pivot:[\"Jan\",\"value\",\"max\"]"
],
"rows": [
[
"A",
"9007199254740993"
]
]
}BigInt による比較では、この2つの大きな整数を区別できます。正確な最大値は文字列 9007199254740993 で、隣接する JavaScript Number の表現可能な値に丸めません。
循環小数の平均を正確な分数で保持
{
"input": "id,month,value\nA,Jan,1\nA,Jan,0\nA,Jan,0",
"parseOptions": {
"delimiter": ",",
"header": true
},
"options": {
"mode": "pivot",
"rowKeys": [
"id"
],
"columnKey": "month",
"valueColumns": [
"value"
],
"aggregation": "avg"
}
}{
"headers": [
"id",
"pivot:[\"Jan\",\"value\",\"avg\"]"
],
"rows": [
[
"A",
"1/3"
]
]
}この平均は 1/3 で、有限小数では表せません。変換後には丸めや二進浮動小数点への変換をせず、正確な既約分数の文字列 "1/3" を保持します。この表現が必要な場合は JSON を使ってください。分数の結果は後続の数値集計が受け付ける十進入力ではありません。
ゼロで始まる識別子の数値化を拒否する
{
"input": "id,month,value\nA,Jan,001",
"parseOptions": {
"delimiter": ",",
"header": true
},
"options": {
"mode": "pivot",
"rowKeys": [
"id"
],
"columnKey": "month",
"valueColumns": [
"value"
],
"aggregation": "sum"
}
}{
"error": "numeric"
}001 は数値の合計に使える表記ではなく、1 に変換せず numeric を返します。このテキストはキーとして使ったり、空でない値として数えたり、逆ピボットでそのままコピーしたりできます。
元の値を変えない逆ピボットの変換前後
{
"input": "id,Jan,Feb\n001,1.00,\n1,,null\n002,0\n003, ,=1+1",
"parseOptions": {
"delimiter": ",",
"header": true
},
"options": {
"mode": "unpivot",
"idColumns": [
"id"
],
"valueColumns": [
"Jan",
"Feb"
],
"variableName": "month",
"valueName": "amount",
"dropEmpty": false
}
}{
"headers": [
"id",
"month",
"amount"
],
"rows": [
[
"001",
"Jan",
"1.00"
],
[
"001",
"Feb",
""
],
[
"1",
"Jan",
""
],
[
"1",
"Feb",
"null"
],
[
"002",
"Jan",
"0"
],
[
"002",
"Feb",
null
],
[
"003",
"Jan",
" "
],
[
"003",
"Feb",
"=1+1"
]
]
}Jan と Feb が元の行順で month の行になります。ID 001、小数表記 1.00、空文字列、文字 null、欠損した Feb、空白、数式のようなテキストは解析後の値を保持します。ここでは数式を実行しません。保護付き CSV は危険な文字列を変更し、JSON はそのまま保持します。
逆ピボットで存在する空文字列だけを除外
{
"input": "id,Jan,Feb\n001,1.00,\n1,,null\n002,0\n003, ,=1+1",
"parseOptions": {
"delimiter": ",",
"header": true
},
"options": {
"mode": "unpivot",
"idColumns": [
"id"
],
"valueColumns": [
"Jan",
"Feb"
],
"variableName": "month",
"valueName": "amount",
"dropEmpty": true
}
}{
"headers": [
"id",
"month",
"amount"
],
"rows": [
[
"001",
"Jan",
"1.00"
],
[
"1",
"Feb",
"null"
],
[
"002",
"Jan",
"0"
],
[
"002",
"Feb",
null
],
[
"003",
"Jan",
" "
],
[
"003",
"Feb",
"=1+1"
]
]
}001 の空の Feb と 1 の空の Jan だけが消えます。002 に存在しない Feb は null のまま残り、空白と文字 null も残ります。この明示的な設定は欠損した観測を黙って消しません。
空の列キーと欠損した列キーを区別
{
"input": "id,month,value\nA,,1\nA\nB,Jan,2",
"parseOptions": {
"delimiter": ",",
"header": true
},
"options": {
"mode": "pivot",
"rowKeys": [
"id"
],
"columnKey": "month",
"valueColumns": [
"value"
],
"aggregation": "sum"
}
}{
"headers": [
"id",
"pivot:[\"\",\"value\",\"sum\"]",
"pivot:[null,\"value\",\"sum\"]",
"pivot:[\"Jan\",\"value\",\"sum\"]"
],
"rows": [
[
"A",
"1",
null,
null
],
[
"B",
null,
null,
"2"
]
]
}空文字列の month と存在しない month は別々のピボット列になります。A の空の分類は合計 1 ですが、欠損分類のレコードには数値がないため集計は null です。B は Jan だけです。メタデータは分類を元の文字列または null として記録します。
行キーと同名になる生成ヘッダーを区別
{
"input": "\"pivot:[\"\"Jan\"\",\"\"amount\"\",\"\"sum\"\"]\",month,amount\n001,Jan,2",
"parseOptions": {
"delimiter": ",",
"header": true
},
"options": {
"mode": "pivot",
"rowKeys": [
"pivot:[\"Jan\",\"amount\",\"sum\"]"
],
"columnKey": "month",
"valueColumns": [
"amount"
],
"aggregation": "sum"
}
}{
"headers": [
"pivot:[\"Jan\",\"amount\",\"sum\"]",
"pivot:[\"Jan\",\"amount\",\"sum\"] [2]"
],
"rows": [
[
"001",
"2"
]
]
}元の行キーヘッダー自体が pivot:["Jan","amount","sum"] です。これはそのまま保持し、生成する集計ヘッダーに " [2]" を追加します。JSON の columns メタデータで元の列、分類値、集計方法の正確な対応を確認できます。
ヘッダーなしのセミコロン区切りをピボット
{
"input": "001;Jan;0.1\n001;Jan;0.2",
"parseOptions": {
"delimiter": ";",
"header": false
},
"options": {
"mode": "pivot",
"rowKeys": [
"column1"
],
"columnKey": "column2",
"valueColumns": [
"column3"
],
"aggregation": "sum"
}
}{
"headers": [
"column1",
"pivot:[\"Jan\",\"column3\",\"sum\"]"
],
"rows": [
[
"001",
"0.3"
]
]
}header:false では最初の行もデータで、位置に応じた列名は column1、column2、column3 です。識別子 001、月 Jan の2行の合計は 0.3 になります。区切り文字は設定で明示し、形式を推測しません。
ピボット・逆ピボットでよくある間違い
- 製品が地域内でのみ一意なのに製品だけを行キーにすること。地域も選んでください。
- 選択した値列の空でない件数を、入力行数や異なる値の数と取り違えること。
- 001 と 1 を同じキーと思い込むことや、CSV なら表計算の型推定を防げると考えること。
- 識別子列を数値集計に選ぶことや、指数表記や地域固有の数値区切りが自動認識されると考えること。
- 1/3 のような正確な分数の平均を丸めた小数と思い込むことや、別の数値集計で受け付ける十進入力として扱うこと。
- 宛先システムで欠損の観測が持つ意味を確認せず、空値を除外すること。
- 集計済みのピボットから個々の元レコードを完全に復元できると考えること。
- 信頼できない元の CSV を表計算で開くことや、個人情報を確認せず結果を共有すること。
制限と注意事項
- 入力の上限はファイルのエンコード済みバイト数とデコード後の UTF-8 テキストがそれぞれ 2 MiB、データ行が 10,000、列が 128、末尾の欠損を補った後のセル数が 200,000 です。出力は 50,000 行、行キーを含めて 256 列、500,000 セルで、JSON と数式対策付き CSV はそれぞれ 12 MiB までです。異なる行キーグループは 10,000、列キーグループは 256 までですが、出力全体の列数が先に上限に達する場合があります。行グループ数 × 分類数 × 値列数による表の拡大を、結果行の作成前にチェックします。上限超過は黙って省略せず変換を止めます。ワーカーのキャンセルと制限時間は実行を制限しますが、ブラウザーのメモリーを完全に隔離するものではありません。
- キーと逆ピボットの識別子は元の文字列です。001 と 1、A と a、空文字列と欠損の null は別の値です。空白の除去、大文字小文字の統一、数値・日付変換、Unicode 正規化、あいまい一致、数式評価はしません。複合キーはタプルとして識別します。行キー、列キー、値列の役割は重複できません。行キーなしでは全レコードが1つの行グループになり、逆ピボットの識別子なしでは変数名と値だけを出力します。ピボットの行と分類は最初に現れた順で、値列は選択順です。逆ピボットは入力行順と選択した値列順です。自動ソートは行いません。
- 件数は存在する空でない値を数え、任意のテキストを含みます。異なる値の数や無条件の入力行数ではありません。数値集計は null と "" だけを飛ばし、文字列全体が任意のマイナス記号、0 またはゼロ以外で始まる整数、必要に応じて小数点と小数部である必要があります。十進の数字は合計100桁、小数部は50桁までです。空白、プラス記号、指数表記、桁区切り、通貨記号、ゼロで始まる整数は拒否します。BigInt により JavaScript の安全な整数範囲を超えても合計・最小・最大・平均を正確な文字列で出力します。有限小数の平均は正規化した十進表記、循環小数の平均は 1/3 のような正確な既約分数です。十進結果は同じ精度上限に従い、分数の分子と分母はそれぞれ100桁までです。小数部末尾のゼロと負のゼロは正規化し、精度超過では変換全体を失敗させます。分数の出力は文字列で、後続の数値集計が受け付ける十進入力ではありません。存在する座標の値がすべて空なら件数は "0"、数値集計は null です。入力に一度もない座標はどの集計でも null です。
- ピボットの列名は pivot: に続けて分類値、値列名、集計方法の JSON タプルを付けます。選択した行キーヘッダーと衝突する場合は " [2]" などの決定的な接尾辞を加え、JSON の列メタデータに正確な対応を残します。記号で分割できると推測しないでください。逆ピボットは欠損の null、存在する ""、文字 "null" を既定で保持します。空値の除外は存在する空文字列だけが対象で、欠損、空白、null という単語は残ります。出力の変数名列と値列は空でない別名とし、保持する ID 列名とも重複できません。集計、数値表記の正規化、空文字列の除外は情報を失います。逆ピボットで集計結果から元の取引明細を復元することはできません。
- 区切り文字はコンマ、セミコロン、タブ、縦棒から明示的に選び、ファイルは UTF-8、UTF-16LE、UTF-16BE に対応します。不正な文字コードや一致しない BOM は拒否します。ヘッダーは空でなく完全一致で一意である必要があり、空白と大文字小文字は保持します。ヘッダーなしでは column1、column2 などを使い、最初のレコードが幅を決めます。短い行の末尾の欠損は null になり、幅が超過した行や不正な引用符は拒否します。プレビューは1ページ25行・12列で、長い名前や値は省略しますが、ダウンロードは上限内の完全な結果です。JSON は結果の文字列、null、メタデータを保持し、元の CSV バイト列は保持しません。CSV は null を引用符なしの空フィールド、"" を引用符付きの空フィールドにしますが、一般的な読み取りソフトは両者を同じ値にします。数式対策は危険なヘッダーや値にアポストロフィーを加えて変更します。元の CSV は数式を実行する場合があり、保護も保存後の再読み込みまで保証しません。表計算の型推定で ID が変わる可能性もあります。入力はローカルに留まり履歴に保存しません。ダウンロードには個人情報が含まれる可能性があり、ページ消去後も残ります。
よくある質問
同じピボット座標に複数の行がある場合はどうなりますか?
行キーの完全なタプル、列キーの値、選択した値列が1つの集計セルを決めます。件数・合計・平均・最小・最大を明示的に選びます。たとえば 0.1 と 0.2 の合計は正確な文字列 0.3 です。最初や最後の行を黙って採用することはありません。行を別々に残したい場合は行キーを追加してください。
金額が拒否されたり、平均が分数になったりするのはなぜですか?
数値集計は意図的に厳格です。ゼロで始まる識別子、空白、プラス記号、指数表記、非対応の精度を推測して数値に変えません。数値として扱う列だけを選ぶか、先に別のコピーを整形してください。(1 + 0 + 0) / 3 のような平均は有限小数にならないため、正確な既約分数の文字列 1/3 を返します。黙って丸めることはありません。十進結果と分数の各部分には明示的な精度上限があります。件数と逆ピボットでは数値変換せずテキストも扱えます。
ピボットの後に逆ピボットすれば元の CSV に戻りますか?
通常は戻りません。ピボットは重複する座標をまとめ、対応する数値表記を正規化する場合があり、存在しない組み合わせのセルも作ります。逆ピボットは選択したワイド形式のセルをロング形式に展開しますが、個々の取引、元の並び順、除外した列は復元できません。元の入力を保管してください。JSON が保持するのは変換結果の文字列、null、列メタデータであり、元ファイルの引用符やバイト列ではありません。
空値、欠損値、文字の null はどう違いますか?
存在する長さゼロのフィールドは空文字列、短いレコードの末尾にないフィールドは欠損、文字 null は通常のテキストです。JSON ではそれぞれ ""、null、"null" として保持します。逆ピボットでは既定ですべて残し、空値の除外は存在する長さゼロの文字列だけを消して欠損の null を残します。数値集計は欠損と空文字列を飛ばしますが、文字 null は無効な数値として扱います。件数にはこの空でないテキストも含まれます。