CSVとは? Comma-Separated Valuesの解説
CSV(Comma-Separated Values)は、各行が1つのrowで、カンマが列を区切る、表形式データのためのプレーンテキストフォーマットです。
CSVは、プログラム間で表形式データを移動する最もシンプルな方法です。あらゆるスプレッドシート、データベース、データツールがインポートとエクスポートできます。そのシンプルさは弱点でもあります: 単一の公式仕様がないため、引用符やエッジケースがツールによって異なります - これはデータパイプラインがCIでCSVを解析するときに問題になります。
CSVとは
CSVファイルはプレーンテキストで、各行が1つのレコードであり、レコード内のフィールドはカンマで区切られます。オプションの先頭行に列ヘッダを持ちます。テーブルやスプレッドシートに自然にマッピングされ、これがデータのrowにとって普遍的な交換フォーマットである理由です。
引用符とエスケープ
厄介なのは、カンマ、引用符、改行を含むデータです。慣例では、そのようなフィールドを二重引用符で囲み、埋め込まれた引用符を二重にすることでエスケープします。ツールは細かい点で食い違うため、内部にカンマを含むフィールドは、誤って解析されるCSVの典型的な原因です。
CSVに本物の標準がない理由
非公式な仕様(RFC 4180)はありますが、実際には区切り文字、line ending、encoding、引用符が異なります。WindowsでエクスポートされたファイルはCRLFのline endingを使うかもしれず、ヨーロッパのエクスポートはカンマの代わりにセミコロンを使うかもしれず、encodingはUTF-8からレガシーなcode pageまで様々です。
データパイプラインとCIにおけるCSV
データパイプラインは、エクスポートやAPIからCSVを取り込み、それを検証・変換することが頻繁にあります。CIではそれらの変換を小さなCSVのfixtureに対してテストし、生成されたレポートCSVが公開前に期待される列とrow数を持つことを検証するjobを持つこともあります。
# Validate a generated CSV in CI
steps:
- run: python export_report.py > report.csv
- run: |
header=$(head -1 report.csv)
test "$header" = "date,builds,minutes"Latchkeyについての注記
CSVを扱うjobは単なる計算処理で、しばしばサンプルデータセットを取得します。Latchkeyではそれらのfixtureを実行間でcacheできるため、データ検証のjobがbuildごとに同じサンプルファイルを再ダウンロードすることがなくなります。
重要なポイント
- CSVは各行が1つのrowでカンマが列を区切るプレーンテキストであり、表形式データに最適です。
- 埋め込まれたカンマや引用符の引用・エスケープのルールはツールによって異なるため、CSVは誤って解析されやすいです。
- データパイプラインはCSVを取り込み、出力します。CIはfixtureと期待される列に対してそれを検証すべきです。