ターミナルでテーブルデータの混乱を制覇する
定期的にデータエクスポートを受け取る方なら、その痛苦はよくご存じでしょう。300メガバイトのファイル、Windows-1251エンコーディング、 区切り文字が場所によってセミコロンだったりカンマだったり、 行内にエスケープされていない改行が含まれている。 これをExcelで開くと、办公スイートが完全にフリーズするか、電話番号の先頭のゼロを誤って削除してしまう確実な方法です。 たかがサニティチェックのためにpandasでクイックPythonスクリプトを書くのも面倒です。
このような状況でcsvkitが活躍します — 表形式データを扱うためのコマンドラインユーティリティのセットです。 このプロジェクトは2011年からGitHub上にあり、6400個以上のスターを集め、bash上でCSVを解析する最も便利な方法の一つとして今も
このユーティリティセットでできること
ジャーナリズムメディアWire Servicesによって作成されたこのパッケージは、pdftkやGDALのようなツールに触発されました。 アイデアはシンプルです:開発者とデータアナリストのために、UNIXパイプラインで表形式ファイルをコードを書かずに清洗、抽出、整形、探索するための specializedコマンドのセットを提供します。
ユーティリティはタスク別に分かれています:変換、抽出、分析、SQLクエリの実行。
クイックプレビューと基本統計
csvlookコマンドは、生のCSVを適切な列揃えの整ったASCIIテーブルに変換します。 headやlessと組み合わせると、優れたプレビューが得られます:
head -n 20 data.csv | csvlook
不明なファイルの構造を理解する必要がある場合は、csvstatを実行してください。 このユーティリティは各列のデータ型を分析し、欠損値を見つけ、最小値、最大値、平均を計算し、最も頻繁に出現する値のリストを表示します:
csvstat data.csv
スライスとフィルタリング
cutやgrepのような従来のUNIXユーティリティは、カンマや改行が引用符で囲まれたフィールド内にある場合、複雑なCSVでしばしば壊れます。 このパッケージには specializedな代替手段があります:
csvcutは必要な列を名前または番号で切り出します:
csvcut -c "user_id,email,status" users.csv > clean_users.csv
csvgrepは値または正規表現で行をフィルタリングします:
csvgrep -c "status" -m "active" users.csv
ファイル上で直接SQL
最も便利なコマンドの一つがcsvsqlです。 二つのことができます。 まず、ファイル内のデータ型を分析して、PostgreSQL、MySQL、またはSQLite用のDDLスキーマを生成します。 次に、組み込みSQLite経由でCSVファイルに対して直接SQLクエリを書くことができます:
csvsql --query "select status, count(*) from users group by status" users.csv
また、2つの異なるファイルを通常のデータベーステーブルであるかのように結合することもできます:
csvsql --query "select u.name, o.total from users u join orders o on u.id = o.user_id" users.csv orders.csv
フォーマットの変換
in2csvツールは、事実上何でもCSVに変換します:Excelファイル(.xlsと.xlsx)、JSON、NDJSON、固定幅。 受け取ったレポートを再保存するためだけにExcelを起動する必要はありません:
in2csv report.xlsx --sheet "Sales" > sales.csv
内部での動作仕組み
このパッケージはPythonで書かれており、PyPI経由で配布されています。 データベース操作にSQLAlchemyを使用しているため、異なるSQLダイアレクトで作業する場合のcsvsqlの柔軟性が説明されます。
アーキテクチャの主な利点は、標準入力と標準出力(stdin/stdout)との互換性です。 コマンドは通常のパイプで簡単につなげることができます:
in2csv data.xlsx | csvgrep -c "country" -m "RU" | csvcut -c 1,3,5 | csvlook
ただし、このアプローチには欠点もあります。 ライブラリが純粋なPythonでランタイム型チェックを使用して書かれているため、マルチギガバイトファイルではパフォーマンスが低下します。 テラバイトスケールのエクスポートには、xsv(Rust製)やduckdbの方が適していますが、日常的な数百メガバイトまでのタスクには、csvkitの速度は十分です。
実践での活用場面
- GUIなしでリモートサーバーでデータ構造を確認する。
- ETLパイプラインにロードする前に、bashスクリプトでファイルを前清洗する。
- 新しいエクスポート用のデータベーステーブルスキーマを生成する(
csvsql -i postgresql data.csv)。 - 共通キーで2つの異なるファイルを
csvjoinで素早くマージする。
インストールする価値はあるか
パッケージは1つのpipコマンドでインストールできます:
pip install csvkit
ログの解析、データベースインポート、ExcelとCSVを含むアーカイブとしてのレポートの受信をよく行う場合、このユーティリティセットは多くの神経を節約してくれます。 2列の基本的なフィルタリングのために重いエディタを開くしたり一回限りのスクリプトを書いたりする必要がなくなります。 まずcsvlookとin2csvから始めましょう — インストールしてから最初の5分でその価値がわかります。
関連プロジェクト