戻る

CSV 分割・複数ファイル結合

データ変換

読み込み中

ツールを読み込んでいます

ツールのコードは開いたときにのみ読み込まれます。

このツールの処理はすべてブラウザー内で行われ、入力内容はサーバーへ送信されません。

このツールについて

1 つの書き出しデータを論理的なデータ件数や完全一致する列値で複数の CSV に分けたり、複数のローカル CSV を 1 つの表に連結したりできます。引用符内の改行は元のフィールドに残ります。結合は画面に表示したファイル順で行い、重複も含めて全データ行を保持します。列名と列順の厳密一致、同じ列名を先頭ファイルに整列、初出順の列の和集合から選択できます。これは縦方向の連結であり、キーによる結合ではありません。解析、出力計画、CSV/ZIP 作成はローカルのブラウザーワーカーで行い、入力のアップロードや履歴保存はしません。

主な用途

  • 取り込みや配送用のファイルを一定のデータ件数に分け、各ファイルに本来のヘッダーを付ける。
  • 部署、アカウント、分類の文字列ごとに分け、グループの順序、内部の行順、識別子、複数行のメモを保持する。
  • 毎月の同じ構造のファイルを連結し、列順の違いは明示的に整列し、新しい列が増えた場合は和集合を確認して使う。

使い方

  1. 1.分割ではテキストの貼り付けまたはローカルファイル 1 つ、結合ではローカルファイル 2~20 個を指定します。全入力に共通のヘッダー設定を選び、カンマ、セミコロン、タブ、パイプを明示的に指定します。文字コードは UTF-8、UTF-16LE、UTF-16BE で、結合ではファイルごとに設定できます。
  2. 2.分割では正の整数のデータ件数、または入力を確認して完全一致で分類する列を選びます。結合では表示順を確認し、上へ・下へで並べ替えてから厳密、整列、和集合を選びます。ヘッダーなしでは同じ列数の位置対応だけを使用します。
  3. 3.実行後、件数、ファイルごとのエラー、出力名、ページ付きプレビューを確認します。無効な入力が 1 つでもあれば全結合を停止します。修正するか明示的にファイルを外して再実行してください。自動スキップはしません。入力や設定を変えると古い結果を破棄します。 表計算ソフトで確認する際は数式保護を有効にし、無加工出力は警告を読んで明示的に選びます。分割は連番名を含む ZIP、結合は merged.csv またはそれを含む ZIP をダウンロードします。表示上の省略は制限内で成功した完全な出力を切り詰めません。

実行検証できる分割・結合の例

引用符内の改行を保ち、CSV レコード単位で分割

{
  "mode": "split",
  "header": true,
  "safe": true,
  "sources": [
    {
      "text": "id,note\n001,\"first\nsecond\"\n002,\"comma, quote \"\"ok\"\"\"\n003,猫",
      "delimiter": ",",
      "encoding": "utf-8"
    }
  ],
  "splitBy": "rows",
  "rowsPerPart": 2
}
{
  "files": [
    {
      "name": "part-0001.csv",
      "records": [
        [
          "id",
          "note"
        ],
        [
          "001",
          "first\nsecond"
        ],
        [
          "002",
          "comma, quote \"ok\""
        ]
      ]
    },
    {
      "name": "part-0002.csv",
      "records": [
        [
          "id",
          "note"
        ],
        [
          "003",
          "猫"
        ]
      ]
    }
  ]
}

フィールド内の改行は件数に含めないため、最初のファイルはデータ 2 件です。各ファイルにヘッダーを付け、先頭ゼロ、カンマ、引用符、Unicode を保持します。

完全一致のグループを初出順で出力

{
  "mode": "split",
  "header": true,
  "safe": true,
  "sources": [
    {
      "text": "group,id\nA,001\n,002\n ,003\na,004\nA,005\n001,006\n1,007",
      "delimiter": ",",
      "encoding": "utf-8"
    }
  ],
  "splitBy": "value",
  "column": 0
}
{
  "files": [
    {
      "name": "part-0001.csv",
      "records": [
        [
          "group",
          "id"
        ],
        [
          "A",
          "001"
        ],
        [
          "A",
          "005"
        ]
      ]
    },
    {
      "name": "part-0002.csv",
      "records": [
        [
          "group",
          "id"
        ],
        [
          "",
          "002"
        ]
      ]
    },
    {
      "name": "part-0003.csv",
      "records": [
        [
          "group",
          "id"
        ],
        [
          " ",
          "003"
        ]
      ]
    },
    {
      "name": "part-0004.csv",
      "records": [
        [
          "group",
          "id"
        ],
        [
          "a",
          "004"
        ]
      ]
    },
    {
      "name": "part-0005.csv",
      "records": [
        [
          "group",
          "id"
        ],
        [
          "001",
          "006"
        ]
      ]
    },
    {
      "name": "part-0006.csv",
      "records": [
        [
          "group",
          "id"
        ],
        [
          "1",
          "007"
        ]
      ]
    }
  ]
}

A と a、空文字と空白 1 文字、001 と 1 は別々の計 6 グループです。A 内の順序も保持します。ZIP 内は連番名のみで、グループ値をファイル名に含めません。

厳密な連結で重複行とヘッダーに似たデータを保持

{
  "mode": "merge",
  "header": true,
  "safe": true,
  "sources": [
    {
      "text": "id,value\n001,2\n001,2",
      "delimiter": ",",
      "encoding": "utf-8"
    },
    {
      "text": "id,value\nid,value\n002,3",
      "delimiter": ",",
      "encoding": "utf-8"
    }
  ],
  "schema": "strict"
}
{
  "files": [
    {
      "name": "merged.csv",
      "records": [
        [
          "id",
          "value"
        ],
        [
          "001",
          "2"
        ],
        [
          "001",
          "2"
        ],
        [
          "id",
          "value"
        ],
        [
          "002",
          "3"
        ]
      ]
    }
  ]
}

ヘッダー名と順序が同じなので連結できます。重複データも、2 番目のファイル内の id,value 行も残します。各ファイルの先頭ヘッダーだけをデータから除きます。

厳密モードでは列順の違いを拒否

{
  "mode": "merge",
  "header": true,
  "safe": true,
  "sources": [
    {
      "text": "id,city\n001,Paris",
      "delimiter": ",",
      "encoding": "utf-8"
    },
    {
      "text": "city,id\nTokyo,002",
      "delimiter": ",",
      "encoding": "utf-8"
    }
  ],
  "schema": "strict"
}
{
  "error": "schemaStrict"
}

2 番目のファイルは列名が同じでも順序が違います。全体を拒否するため、名前で並べ替える意図がある場合は明示的に名前による整列を選びます。

完全一致する列名を最初のファイルに合わせる

{
  "mode": "merge",
  "header": true,
  "safe": true,
  "sources": [
    {
      "text": "id,city\n001,Paris",
      "delimiter": ",",
      "encoding": "utf-8"
    },
    {
      "text": "city,id\nTokyo,002",
      "delimiter": ",",
      "encoding": "utf-8"
    }
  ],
  "schema": "align"
}
{
  "files": [
    {
      "name": "merged.csv",
      "records": [
        [
          "id",
          "city"
        ],
        [
          "001",
          "Paris"
        ],
        [
          "002",
          "Tokyo"
        ]
      ]
    }
  ]
}

列名の集合が完全一致する場合に、2 番目の行を id,city 順に並べます。列名の空白削除、大文字小文字の同一視、別名の意味の推測は行いません。

和集合では列を追加し、欠損と空文字の区別を失う

{
  "mode": "merge",
  "header": true,
  "safe": true,
  "sources": [
    {
      "text": "id,name\n001,Ada\n002,",
      "delimiter": ",",
      "encoding": "utf-8"
    },
    {
      "text": "id,city\n003,Tokyo",
      "delimiter": ",",
      "encoding": "utf-8"
    }
  ],
  "schema": "union"
}
{
  "files": [
    {
      "name": "merged.csv",
      "records": [
        [
          "id",
          "name",
          "city"
        ],
        [
          "001",
          "Ada",
          ""
        ],
        [
          "002",
          "",
          ""
        ],
        [
          "003",
          "",
          "Tokyo"
        ]
      ]
    }
  ]
}

新しい city 列を id,name の後ろに追加します。存在しない列は空文字になるため、002 の元から空の name と 003 にない name は区別できません。区別が必要なら元ファイルを保持します。

ヘッダーなしの異なる区切り文字を位置で連結

{
  "mode": "merge",
  "header": false,
  "safe": true,
  "sources": [
    {
      "text": "001;Paris\n002;Tokyo",
      "delimiter": ";",
      "encoding": "utf-8"
    },
    {
      "text": "003\tOsaka",
      "delimiter": "\t",
      "encoding": "utf-8"
    }
  ],
  "schema": "strict"
}
{
  "files": [
    {
      "name": "merged.csv",
      "records": [
        [
          "001",
          "Paris"
        ],
        [
          "002",
          "Tokyo"
        ],
        [
          "003",
          "Osaka"
        ]
      ]
    }
  ]
}

どちらも 1 レコード 2 フィールドなので、仮のヘッダーを追加せずデータ 3 件を出力します。入力の区切り文字はファイルごとに選べますが、出力は UTF-8 のカンマ区切り CSV です。

ヘッダーだけの入力は件数分割で 1 ファイル

{
  "mode": "split",
  "header": true,
  "safe": true,
  "sources": [
    {
      "text": "id,city",
      "delimiter": ",",
      "encoding": "utf-8"
    }
  ],
  "splitBy": "rows",
  "rowsPerPart": 1
}
{
  "files": [
    {
      "name": "part-0001.csv",
      "records": [
        [
          "id",
          "city"
        ]
      ]
    }
  ]
}

データは 0 件ですが、件数分割ではヘッダーのみのファイルを 1 つ返します。ヘッダーはデータ件数に含みません。

ヘッダーだけでは値のグループを作らない

{
  "mode": "split",
  "header": true,
  "safe": true,
  "sources": [
    {
      "text": "id,city",
      "delimiter": ",",
      "encoding": "utf-8"
    }
  ],
  "splitBy": "value",
  "column": 1
}
{
  "files": []
}

グループ値を持つデータがないため 0 グループとなり、空の ZIP はダウンロードできません。0 バイトの入力は別途エラーです。

全ファイルの式を起動し得るセルを保護

{
  "mode": "split",
  "header": true,
  "safe": true,
  "sources": [
    {
      "text": "=header,value\n=1+1,-42\n@SUM(A1),plain",
      "delimiter": ",",
      "encoding": "utf-8"
    }
  ],
  "splitBy": "rows",
  "rowsPerPart": 1
}
{
  "files": [
    {
      "name": "part-0001.csv",
      "records": [
        [
          "'=header",
          "value"
        ],
        [
          "'=1+1",
          "'-42"
        ]
      ]
    },
    {
      "name": "part-0002.csv",
      "records": [
        [
          "'=header",
          "value"
        ],
        [
          "'@SUM(A1)",
          "plain"
        ]
      ]
    }
  ]
}

標準の保護では危険なヘッダーと値にアポストロフィを付けます。全角記号や負数も対象で、両ファイルのヘッダーを保護します。出力値は変わります。CSV の引用符だけでは式対策になりません。

無加工の出力は現在の入力に対して明示的に選ぶ

{
  "mode": "split",
  "header": true,
  "safe": false,
  "sources": [
    {
      "text": "=header,value\n=1+1,-42",
      "delimiter": ",",
      "encoding": "utf-8"
    }
  ],
  "splitBy": "rows",
  "rowsPerPart": 1
}
{
  "files": [
    {
      "name": "part-0001.csv",
      "records": [
        [
          "=header",
          "value"
        ],
        [
          "=1+1",
          "-42"
        ]
      ]
    }
  ]
}

保護を外すと解析した文字列をそのまま出力します。表計算ソフトが式を実行したり識別子を変換したりするため、信頼できる用途に限ります。入力や変換設定を変えると保護設定を戻します。

不正な列数のファイルが 1 つでも全体を停止

{
  "mode": "merge",
  "header": true,
  "safe": true,
  "sources": [
    {
      "text": "id,city\n001,Paris",
      "delimiter": ",",
      "encoding": "utf-8"
    },
    {
      "text": "id,city\n002",
      "delimiter": ",",
      "encoding": "utf-8"
    }
  ],
  "schema": "strict"
}
{
  "error": "width"
}

2 番目の入力では city フィールドがありません。どの方式でも列数の不整合を拒否します。和集合が補うのは正しい表構造間の列不足であり、不正なレコードのフィールド不足ではありません。部分出力もしません。

分割・結合でよくある間違い

  • 複数行のメモを含む CSV を、論理レコードではなく改行数で数える。
  • 列が増減したファイルに名前整列を選ぶ。この構造差を許可するのは和集合のみです。
  • 和集合の出力で、存在しなかった列と元から空文字のセルを区別できると思う。
  • 共通のヘッダー設定でヘッダーあり・なしを混在させたり、短いレコードの自動補完を期待したりする。
  • 縦方向の連結が重複を削除したり共通 ID で情報を補ったりすると期待する。
  • 区切り文字や文字コードを誤って選び、自動修復を期待する。
  • 信頼できない無加工の CSV を表計算ソフトで開く、または CSV の引用符だけで式を防げると思う。
  • 暗号化されていない ZIP の私的情報を確認せず共有する。

制限と注意事項

  • 各入力の上限は元ファイル 2 MiB、復号後の UTF-8 テキスト 2 MiB、データ 10,000 件、128 列、データセル 200,000 個です。結合は 2~20 ファイルで、全体では元バイト 8 MiB、復号後 UTF-8 8 MiB、データ 40,000 件、入力セル 500,000 個までです。出力はデータ 40,000 件、128 列、セル 500,000 個、分割は 100 ファイルまたはグループまでです。超過時は停止し、黙って切り詰めません。
  • シリアライズした CSV 全体は 12 MiB、ZIP は 13 MiB までです。繰り返すヘッダー、引用符のエスケープ、UTF-8 文字、数式保護の接頭辞も数えます。ZIP は無圧縮で格納するため、サイズ削減を保証するものではありません。ワーカー操作には 10 秒の期限があり、キャンセルできます。割り当て量の検査はブラウザーのヒープ使用量を一定値に保証するものではありません。
  • 分割で数えるのは論理的なデータレコードであり、テキストの改行数ではありません。ヘッダーだけの入力は件数分割でヘッダーのみ 1 ファイル、値分割で 0 グループとなり、0 グループでは ZIP を出力しません。0 バイトはエラーです。空文字、空白、大文字小文字、Unicode の表現の違い、001 と 1 は別グループです。初出順とグループ内の行順を維持します。グループ値や元ファイル名は ZIP 内の名前に使わず、平坦な part-0001.csv などの連番名または merged.csv だけを使います。
  • 厳密方式は列名と順序の完全一致が必要です。整列は完全一致する列名集合を先頭ファイルの順序に並べます。和集合はファイルとヘッダー内で最初に現れる順に新しい列を追加し、存在しない列を空文字で補うため、列欠損と元から空のセルの区別が失われます。どの方式でも各入力には空白でない一意のヘッダーと一貫したレコード幅が必要です。ヘッダーなしの結合は同じ幅の位置対応のみで、仮ヘッダーは出力しません。重複行やヘッダーと同じ内容のデータ行も残します。
  • 文字コードは明示的に選びます。不正なバイト、選択と矛盾する BOM、UTF-32 は拒否し、旧式文字コードや区切り文字の自動推測はしません。出力は UTF-8 のカンマ区切り CSV、レコード区切りは CRLF で、フィールド内の改行は元のままです。無加工出力は解析後の文字列を保持しますが、元バイト、引用形式、レコード区切りは保持しません。数式保護は危険なヘッダーと値にアポストロフィを加えるため値が変わります。あらゆる表計算ソフトでの安全は保証せず、識別子や日付の自動変換もあり得ます。無加工 CSV は式を起動する場合があり、入力や変換設定を変えると保護を戻します。 プレビューは 1 ページ 25 行、12 列までで、長いセルとラベルは画面上で省略します。成功したダウンロードは上限内の全結果を含みます。キャンセル、リセット、新しい入力、順序変更、画面移動では処理中の結果と出力を破棄します。入力の送信や永続保存はしませんが、ダウンロードには処理した私的情報が含まれ得ます。画面を消去しても保存済みファイルは消えません。

よくある質問

1,000 件ごとの分割は、1,000 行の改行ごとの分割と同じですか?

違います。引用符で囲んだ CSV フィールドは複数の改行を含んでも 1 つのデータレコードの一部です。レコードを解析して本来のヘッダーを件数から除き、各分割ファイルに再度ヘッダーを付けます。ヘッダーなしの入力には追加しません。

どの結合方式を選び、不正なファイルはどう扱いますか?

列名と順序が同じはずなら厳密、列名集合は完全一致して順序だけ異なるなら整列を使います。列の追加や不足が意図的な場合だけ和集合を選びます。新しい列を追加して不足を空文字で補うため、欠損と空文字の区別は失われます。どの方式も不正なレコードを修復しません。 件数を制限したファイル別の診断を表示し、全結合とダウンロードを停止します。修正するか、一覧から意図的に外して再実行してください。一部だけ成功した CSV や ZIP を黙って作ることはありません。

結合は重複削除や ID による照合も行いますか?

行いません。画面のファイル順で全データレコードを追加します。重複削除、並べ替え、空白削除、値の型変換、キー照合はありません。キーで情報を補う場合は CSV キー結合を、重複削除が必要なら別コピーに対する明示的なクリーニングを使ってください。

数式保護をどう選び、出力を共有すればよいですか?

標準で有効な数式保護が、特定の先頭空白、制御文字、全角記号も含めて式を起動し得るセルを変更するためです。各ファイルに繰り返すヘッダーにも適用します。無加工を明示的に選べば解析した文字列のままですが、表計算ソフトで式を実行する可能性があります。どちらの設定もすべての型変換を防ぐものではありません。 分割では part-0001.csv などの決まった連番名、結合では merged.csv を使います。グループ値はローカルの一覧と CSV 本文には見えますが、ZIP 内のファイル名にはしません。ZIP は暗号化されないため、共有前に中身を確認してください。

関連ツール