てもとツール
ガイド

CSVでカンマや改行を含むセルの書き方|ダブルクォートの規則

CSVでカンマ・改行・ダブルクォートを含むセルは、セル全体を「"」で囲み、中の「"」は「""」と2つ重ねて書きます。カンマのあとに空白を入れて囲むと囲みとして読まれず、列がずれます。崩れ方から原因を見分ける方法も実例で説明します。

公開読了目安 約5分

この記事の要点

  • カンマ・改行・ダブルクォートを含むセルは、セル全体をダブルクォートで囲む
  • 囲んだセルの中のダブルクォートは、2つ重ねて書く
  • カンマのあとに空白を入れてから囲むと、囲みとして読まれず列がずれる
  • 囲みを閉じ忘れると、そこから後ろが1つのセルにつながる
  • 改行を含むセルがあると、ファイルの行数とデータの件数が合わなくなる
目次

CSVでカンマ・改行・ダブルクォートを含むセルは、セル全体をダブルクォート(")で囲みます。 囲んだセルの中に " を書くときは、"" と2つ重ねます。

この2つが、CSVの書き方をまとめた RFC 4180 の決まりです。 決まりから外れたときの崩れ方には型があり、崩れ方を見れば原因の見当がつきます。

この記事の読み取り結果は、このサイトのCSV⇔JSON変換ツールと、Python 3 の csv モジュールの2つで確かめました。 表計算ソフトでの開き方は、ソフトごとに違いうるので扱いません。

囲む必要があるのは3種類の文字を含むセル

CSVは、カンマでセルを区切り、改行で行を区切ります。 そのため、セルの中身にカンマや改行が入ると、区切りと見分けがつかなくなります。

囲みが要るのは、次の3つのどれかを含むセルです。

  • カンマ: 「港区1-2-3, 2階」のような住所
  • 改行: 2行に分けて書いたメモ
  • ダブルクォート: "特選" のように引用符を使った商品名

3つとも含む例を書くと、次のようになります。

名前,住所,メモ
山田,"東京都港区1-2-3, 2階","1行目
2行目"
佐藤,大阪市,"商品名は""特選""です"

このCSVは、見出しのほかに2件のデータとして読まれます。 山田さんの住所は「東京都港区1-2-3, 2階」で1つのセル、メモは改行を含んだ1つのセルです。

佐藤さんのメモは 商品名は"特選"です と読まれます。 囲みの中の "" が、1つの " に戻るからです。

囲んだセルの中の引用符は2つ重ねる

囲みの中で " を1つだけ書くと、そこで囲みが閉じたと読まれます。 中身として " を書きたいときは、"" と2つ続けます。

たとえば 15"モニター と書きたいなら、セルは "15""モニター" です。 囲まずにそのまま書く形は、RFC 4180 の決まりからは外れます。

確かめた2つの読み取りでは、囲んでいないセルの途中の " は、そのまま文字として読まれました。 ただし決まりの外の書き方なので、読み取る側によって結果が変わりえます。

崩れ方から原因を見分ける

崩れたCSVは、読み取った結果の形から原因を絞れます。 よく出る形を3つ並べます。

項目が見出しより多い行がある

住所の「2階」が、次の列や見出しの無い列に押し出される形です。 カンマを含むセルを囲み忘れると、この形になります。

名前,住所
山田,東京都港区1-2-3, 2階

この行は「山田」「東京都港区1-2-3」「 2階」の3項目に分かれます。 見出しは2項目なので、「 2階」の行き場がありません。

CSV⇔JSON変換 でJSONにすると、見出しより多い分はJSONに入りません。 そのかわり「確認してください」の欄に、見出しより項目が多いデータの件数と、JSONの何件目かが出ます。

カンマのあとに空白を入れてから囲んだ場合も、同じく項目が多くなります。 2つの見分け方は、後の「カンマのあとの空白で、囲みが効かなくなる」で説明します。

引用符が消えて、セルの後ろに残る

囲んだセルの中の " を重ね忘れた形です。

名前,メモ
山田,"商品名は"特選"です"

確かめた2つの読み取りでは、メモは 商品名は特選"です" になりました。 2つ目の " で囲みが閉じ、残りの文字がそのまま後ろにつながるためです。

この形になったら、囲みの中の " の重ね忘れを疑えます。 Python の csv モジュールで、決まりに厳しい読み方(strict=True)にすると、エラーで止まります。

途中から後ろが、全部1つのセルになる

囲みを開いたまま閉じ忘れた形です。

名前,メモ
山田,"閉じ忘れ
佐藤,次の行

閉じの " が来るまで、改行もカンマもセルの中身として読まれます。 この例では「佐藤,次の行」までが、山田さんのメモになります。

CSV⇔JSON変換ツールでは、この形は「クォートが閉じられていないフィールドがあります」というエラーになります。 Python の csv モジュールは、既定の読み方では最後まで1つのセルとして読み、エラーにしませんでした。

カンマのあとの空白で、囲みが効かなくなる

見落としやすいのが、区切りのカンマのあとに空白を入れてから囲む書き方です。

名前,住所
山田, "東京都港区1-2-3, 2階"

RFC 4180 では、空白もセルの中身の一部として扱います。 この行の2つ目のセルは空白から始まるので、" は囲みではなく、ただの文字になります。

確かめた2つの読み取りでは、どちらも次の3項目に分かれました。

  • 「山田」
  • 先頭に空白が付いた "東京都港区1-2-3
  • 先頭に空白が付いた 2階"

セルの中に " が文字として残っているなら、この形を疑えます。 囲み忘れた場合は、" はどこにも出てきません。

改行を含むセルがあると、行数と件数が合わない

囲んだセルの中の改行は、行の区切りではありません。 そのため、ファイルを行で数えた数と、データの件数が食い違います。

最初の例のCSVは、ファイルとしては4行あります。 データとして読むと、見出しと2件の計3行です。

テキストエディタで4行目に見える「佐藤,…」は、データとしては3行目です。 行番号を頼りに探すと、別のデータに当たることがあります。 件数で確かめたいときは、JSONに変えて何件目かで見るほうが確実です。

改行を含むセルが、名簿の差し込みを崩す例もあります。 詳しくは 差し込みで名前が置き換わらない原因 にまとめました。

手で囲むより、書き出す側に任せる

囲みや "" を手で書き足すと、どこかで重ね忘れが起きやすくなります。 データがJSONで手元にあるなら、CSVへの書き出しに任せる方法もあります。

CSV⇔JSON変換 の「JSON → CSV」は、カンマ・"・改行を含むセルだけを自動で囲みます。 中の " も "" に重ねるので、上の例と同じ形のCSVが出てきます。

関連記事

まとめ

カンマ・改行・ダブルクォートを含むセルは、セル全体を " で囲みます。 囲みの中の " は、"" と2つ重ねます。

崩れたときは、項目が多いのか、" が後ろに残るのか、後ろがつながるのかを見ます。 セルの中に " が文字で残っていたら、カンマのあとの空白も疑ってください。

参考・出典

本記事は上記の公的機関・公式情報源を参考にしています。最新の情報は各リンク先をご確認ください。

あわせて読みたい

同じテーマ・関連ツールの記事です。