CSVをMarkdownに変換する:書き出したデータをモデルに読める形にする
生のCSVは、技術的には言語モデルにも読めます。ただし、データの渡し方としては最悪の部類です。どの行も 目印のないカンマ区切りの値の羅列で、ヘッダーは一番上に一度出るきり。40行目あたりでモデルは、どのフィールドが どれなのかをカンマの数を数えて突き止めようとしています。「3番目の商品の粗利は?」と聞けば、粗利がどの列に あるかを堂々と取り違えた答えが返ってきます。
Markdownのパイプ表はこれを解決します。列は揃い、ヘッダー行はその下の区切り線によってヘッダーだと明示され、
どのセルも見た目で位置が分かります。モデルはこの形式の扱いが得意です。README、ドキュメント、GitHubのissueと、
学習データのいたるところに出てくるからです。上に.csvをアップロードすれば、数秒で表が返ってきます。
無料、登録不要、何も保存しません。
CSVをMarkdownの表にすると何が得られるか
構造上の違いは紙の上では小さく、実運用では大きく効きます。
- ヘッダーが一意になります。
|---|---|という区切り行が、どのMarkdown パーサーにも——そしてそれを何百万回と読んできたモデルにも——上の行はデータではなく列名だと伝えます。 - 列方向の推論が楽になります。「下降傾向にある地域はどこか」「価格列の外れ値を探して」 といった問いは縦に読む必要があります。パイプ表は縦読みを構造として使える形にしますが、カンマの羅列は そうではありません。
- 空セルが見えたままになります。生のCSVでは
a,,cは読み違えやすい形です。| a | | c |なら空きが一目で分かります。欠損そのものが問いの対象であるときに効いてきます。 - 貼り付けても壊れません。チャット、GitHubのコメント、Notionのページ、ドキュメントサイトの どこに落としても、文字の染みではなく本物の表として描画されます。散文やコードと同じプロンプトに 同居させても、モデルが三者を混同しません。
区切り文字と引用符、そして「CSV」という嘘
CSVに単一の標準はありません。あるのはゆるい合意だけで、人々はそこから絶えず逸脱します。パースする側は いくつもの現実を引き受けなければなりません。
区切り文字はいつもカンマとはかぎりません。ドイツ語、フランス語、スペイン語、オランダ語の
ロケールに設定されたシステムからの書き出しは、たいていセミコロンを使います。それらの地域ではカンマが
小数点だからです。タブ区切りのファイルが.csv拡張子で保存されているのも日常茶飯事です。
パイプ区切りは古いデータベースの書き出しに出てきます。区切り文字の判定は、先頭の数行をサンプリングして
フィールド数が一貫する候補を選ぶ方式です。通常のケースでは信頼できますが、最初の数行の自由記述に
たまたまセミコロンが多いファイルには騙されることがあります。
引用符で囲まれたフィールドは区切り文字を含みます。定番は住所です。
"山田, 太郎",42,"東京都, 日本"は5フィールドではなく3フィールドです。二重引用符で囲まれたものは、
中身が何であれ1つの値であり、それは埋め込まれた改行についても同じです。複数行のテキストが入るコメント列は
CSVとして正当で、ファイル上では数行にまたがりながら、なお1つのセルです。引用フィールドの中の引用符は
二重にしてエスケープします。"彼は""いいえ""と答えた"のように。これらはすべて処理されます。
素朴なカンマ分割スクリプトが現実の書き出しで壊れ、ちゃんとしたパーサーが壊れない理由がここにあります。
知っておく価値のある副作用が1つあります。データにパイプ記号そのものが含まれる場合、Markdownの出力側で
エスケープしないと表が崩れてしまいます。これは処理されますが、つまりa|bを含むセルは、
出力では元のファイルと少し違う見た目になります。
ヘッダー、列数の揃わない行、表になりきっていないファイル
CSVファイルには、1行目がヘッダーかどうかを宣言する手段がありません。推測するしかないのです。1行目がすべて 文字列で、その下の行に数値や日付が入っていれば、まず間違いなく列名です。どの行も同じように見える場合でも、 1行目はヘッダーとして扱われます。圧倒的にそちらが多いからです。本当にヘッダーのないファイルなら、 最初のデータ行がヘッダーの位置に繰り上がっているのが見えるはずです。気づくのは簡単で、変換前に ヘッダー行を1行足せば直ります。
もう1つよくあるのが列数の揃わない行——ヘッダーより多い、あるいは少ないフィールドを持つ行——です。 手で編集されたファイル、ファイルの前のほうにあるエスケープ漏れの引用符が以降の位置をすべてずらしている、 書き出しが末尾に合計行を付け足している、あたりが原因です。Markdownの表は列数が固定である必要があるので、 短い行は詰め物をされて形だけは保たれます。表の一区画がまるごと1列ずれて見えるなら、その上に 対になっていない引用符がないか探してください。ほぼ必ずそれが犯人です。
BIツールは本当のヘッダーの前にレポート名と日付を差し込みがちです。それらの行も表の一部として読まれます。 先に消しておいてください。
Excel由来のCSVとその癖
世の中のCSVファイルのかなりの割合はExcelから出てきたもので、Excelは指紋を残します。
- 先頭のBOM。ExcelはUTF-8の書き出しにバイトオーダーマークを付けるので、それを 取り除かないツールでは最初の列名に見えないゴミが付きます。ここでは除去されます。
- 数値にされてしまった値。桁の長いIDが
1.23457E+14として保存されるのは、 Excelがそれを数値だと判断したからです。この破壊はCSVが存在する前、スプレッドシートの段階で 起きています。どんな変換ツールも元には戻せません。書き出す前に、元の列の書式を文字列にしてください。 - 先頭のゼロが消える。郵便番号や商品コードが同じ理由で失われます。
- 日付が組み替えられる。マシンのロケールに合わせて書き換えられ、その結果
03/04は永遠に曖昧なままになります。 - エンコーディングの取り違え。Windowsの「CSVとして保存」は、環境によってUTF-8ではなく
CP932(Shift_JIS)で書き出します。日本語が
譁�蟄怜喧縺�や���のように なっていたら、それはエンコーディングの取り違えによる文字化けです。「CSV UTF-8」で書き出し直せば 消えます。
書き出したCSVではなく元のブックがまだ手元にあるなら、 ExcelをMarkdownにで直接 変換すればこの大半を飛ばせます。XLSXならセルの型が保たれますし、誰かが保存したときにたまたま アクティブだった1枚ではなく、全シートが手に入ります。
Markdownが正解ではない場面
パイプ表にはサイズの天井があり、それは思われているより低い位置にあります。行ごとにパイプと詰め物の代金を 払うので、同じデータを素の値で持つ場合より明確にトークンを食います。200行のファイルなら無関係な話です。 5万行の書き出しでは、コンテキストに収まるか収まらないかの差になります。
もう1つの限界は横幅です。40列の表はたいていのビューアで折り返されて判読不能なスープになり、そもそも この形式を選ぶ理由だった桁揃えの利点が消えます。だいたい12列を超えたあたりから、天秤は逆に傾き始めます。
そういう場合はCSVをプレーンテキストにを 使ってください。表の足場なしで値だけが手に入るので、大きなファイル、埋め込み、スクリプトへの流し込みには こちらが向いています。ページ上部の形式切り替えは両者を行き来し、選んだファイルもそのまま保持します。 出力の下のトークンカウンターを見れば、表版が予算に収まるかどうかがその場で分かります。
これが元を取る場面
- チャット窓でのその場の分析。クエリ結果を書き出し、変換し、貼り付け、質問する。 数百行程度なら、分析コードを書くよりこちらが速いです。
- ドキュメント作成。CSVからMarkdown表を生成するのは、設定用の スプレッドシートからREADMEやドキュメントページの表に至る最短経路です。
- データの目視レビュー。列が揃っていれば、異常はモデルだけでなく人間にも見えます。 フィールドが1つ入れ替わった行を見つけるのは、表のほうが圧倒的に楽です。GitHubのissueでサンプルデータを 見せるとき、生のCSVコードブロックより表のほうが読みやすいのも同じ理由です。
- データとコードを組み合わせる。CSVを変換したうえで、 GitHubをテキストに変換するツールで プロジェクトも変換し、自分のパース処理がこのファイルの中身を本当に扱えているかをモデルに 確認させてみてください。
よくある質問
CSVファイルをMarkdownの表に変換するには?
上で.csvをアップロードすれば、パイプ表として返ってきます。README、issue、ドキュメントページ、プロンプトにそのまま貼れる状態です。無料、1ファイル50MBまで、登録不要。1行目はヘッダーとして扱われますが、これはほぼすべてのCSV書き出しが作る形です。
CSVにヘッダー行がない場合はどうなりますか?
最初のデータ行がヘッダーに繰り上がり、その分が本文から消えます。いちばん簡単な対処は、アップロード前に元ファイルへヘッダー行を1行足すことです。col1,col2,col3のような仮の名前でも構いません。Markdownのパイプ表は構文上ヘッダー行を必須としていて、何かがそこを埋めなければならないからです。
どのくらいの大きさのCSVならMarkdownに変換する価値がありますか?
実際のところ数百行までです。Markdownの表にはページ送りも並べ替えもスクロールもありません。1万行の表は誰の役にも立たないパイプの壁で、モデルに貼り付ければ大量のコンテキストを燃やします。先にスプレッドシート側で必要な行だけ絞り込み、その部分集合を変換してください。
データの中のパイプ記号はエスケープされますか?
されなければ困ります。セルの中のエスケープされていない|は列の境界として読まれ、それ以降の値を黙ってすべてずらしてしまうからです。パイプを含むデータ——ログ行、一部のURL、コマンド例——を扱っているなら、思い込まずに、パイプを含む行を出力側で1つ確認してください。
この表はGitHubで表示されますか?
されます。ここが出力するのはGitHub Flavored Markdownのパイプ表そのものなので、README、issue、プルリクエストの説明文、ディスカッションのコメントで手を加えずに描画されます。同じ構文はGitLab、Obsidian、Notionへのインポート、そしてたいていの静的サイトジェネレーターでも通ります。
関連する変換ツール
1ページで全部済ませたいなら、File2Txtが 対応形式のファイルを何でも受け付けます。ほかの構造化形式については、平たいグリッドに収まらない 入れ子データを扱うJSONをMarkdownにと XMLをMarkdownにがあり、 保存したWebページから表を抜き出すには HTMLをMarkdownにがあります。 文書はPDFをMarkdownに変換を通します。
コード側にはGitLab変換と ローカルフォルダ変換があり、公開中のページを 取得するWeb2Txtもあります。 ファイルをテキストに変換するガイド では、もう少し広い作業の流れを扱っています。
Repo2Txtを開発・運営しているのは v12hero、 プライバシー最優先のネイティブアプリとWebアプリを作る独立系デベロッパーです。