はじめに
- csvファイルをデータ分析のために簡単にハンドリング・クレンジングしてくれるためのオープン・ソースのツール
- pythonからインストール可能
- 公式ページのドキュメントが揃っているので、本格的に使うならそっちをチェックしてください。
インストール
pipが使えるなら、下記1行でインストール可能
$ pip install csvkit
詳細は公式ページをご覧ください。
コマンド一覧
$ ls /usr/local/bin/*csv*
/usr/local/bin/csvclean /usr/local/bin/csvgrep /usr/local/bin/csvlook /usr/local/bin/csvsql /usr/local/bin/in2csv
/usr/local/bin/csvcut /usr/local/bin/csvjoin /usr/local/bin/csvpy /usr/local/bin/csvstack /usr/local/bin/sql2csv
/usr/local/bin/csvformat /usr/local/bin/csvjson /usr/local/bin/csvsort /usr/local/bin/csvstat
結構ある。これで全部かな?
データの準備
- さわりたいcsvファイルを持ってきましょう。
$ head -n 10 iris.csv
,Sepal.Length,Sepal.Width,Petal.Length,Petal.Width,Species
1,5.1,3.5,1.4,0.2,setosa
2,4.9,3,1.4,0.2,setosa
3,4.7,3.2,1.3,0.2,setosa
4,4.6,3.1,1.5,0.2,setosa
5,5,3.6,1.4,0.2,setosa
6,5.4,3.9,1.7,0.4,setosa
7,4.6,3.4,1.4,0.3,setosa
8,5,3.4,1.5,0.2,setosa
9,4.4,2.9,1.4,0.2,setosa
データの確認
csvlook
- 見やすく整形してくれて表示してくれる
- セパレータがカンマ以外の場合は
-d "|"
など
$ csvlook iris.csv | head -n 10
|------+--------------+-------------+--------------+-------------+-------------|
| | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
|------+--------------+-------------+--------------+-------------+-------------|
| 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 2 | 4.9 | 3 | 1.4 | 0.2 | setosa |
| 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
| 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
| 5 | 5 | 3.6 | 1.4 | 0.2 | setosa |
| 6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa |
| 7 | 4.6 | 3.4 | 1.4 | 0.3 | setosa |
列名だけ確認
csvcut -n
R でいうnames()的な
$ csvcut -n iris.csv
1:
2: Sepal.Length
3: Sepal.Width
4: Petal.Length
5: Petal.Width
6: Species
列選択
csvcut -c
ある1列だけ(列番号で)
$ csvcut -c 2 iris.csv | head
Sepal.Length
5.1
4.9
4.7
4.6
5
5.4
4.6
5
4.4
ある1列だけ(列名で)
$ csvcut -c Sepal.Length iris.csv | head
Sepal.Length
5.1
4.9
4.7
4.6
5
5.4
4.6
5
4.4
ある2列以上を選択&csvlook
$ csvcut -c 2,4 iris.csv | csvlook | head
|---------------+---------------|
| Sepal.Length | Petal.Length |
|---------------+---------------|
| 5.1 | 1.4 |
| 4.9 | 1.4 |
| 4.7 | 1.3 |
| 4.6 | 1.5 |
| 5 | 1.4 |
| 5.4 | 1.7 |
| 4.6 | 1.4 |
ある列を除いて&csvlook
$ csvcut -C Species iris.csv | csvlook | head
|------+--------------+-------------+--------------+--------------|
| | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width |
|------+--------------+-------------+--------------+--------------|
| 1 | 5.1 | 3.5 | 1.4 | 0.2 |
| 2 | 4.9 | 3 | 1.4 | 0.2 |
| 3 | 4.7 | 3.2 | 1.3 | 0.2 |
| 4 | 4.6 | 3.1 | 1.5 | 0.2 |
| 5 | 5 | 3.6 | 1.4 | 0.2 |
| 6 | 5.4 | 3.9 | 1.7 | 0.4 |
| 7 | 4.6 | 3.4 | 1.4 | 0.3 |
行抽出・フィルタリング
csvgrep
- ある列に対して、指定した条件で、データを見る
- grep的な
- 区間に入るものも定義できる
$ csvgrep -c Species -m setosa iris.csv | csvlook | head
|-----+--------------+-------------+--------------+-------------+----------|
| | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
|-----+--------------+-------------+--------------+-------------+----------|
| 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 2 | 4.9 | 3 | 1.4 | 0.2 | setosa |
| 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
| 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
| 5 | 5 | 3.6 | 1.4 | 0.2 | setosa |
| 6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa |
| 7 | 4.6 | 3.4 | 1.4 | 0.3 | setosa |
正規表現でも
$ csvgrep -c Species -r ^s.*$ iris.csv | csvlook | head
|-----+--------------+-------------+--------------+-------------+----------|
| | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
|-----+--------------+-------------+--------------+-------------+----------|
| 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 2 | 4.9 | 3 | 1.4 | 0.2 | setosa |
| 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
| 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
| 5 | 5 | 3.6 | 1.4 | 0.2 | setosa |
| 6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa |
| 7 | 4.6 | 3.4 | 1.4 | 0.3 | setosa |
区間でも
$ csvgrep -c Sepal.Length -r "[4.5-5]" iris.csv | csvlook | head
|------+--------------+-------------+--------------+-------------+-------------|
| | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
|------+--------------+-------------+--------------+-------------+-------------|
| 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 2 | 4.9 | 3 | 1.4 | 0.2 | setosa |
| 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
| 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
| 5 | 5 | 3.6 | 1.4 | 0.2 | setosa |
| 6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa |
| 7 | 4.6 | 3.4 | 1.4 | 0.3 | setosa |
フォーマット変形
csvformat
- タブ区切りなど、フォーマットの変形ができる
$ csvformat -T iris.csv
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
<snip>
他のファイルとのJoin
csvjoin
- 別ファイルとJoinできる
- Outer, Left, Right と指定可能
統計値情報をサマリ
csvstat
- 便利だなー。
csvstat iris.csv
1. _unnamed
<type 'int'>
Nulls: False
Min: 1
Max: 150
Sum: 11325
Mean: 75.5
Median: 75.5
Standard Deviation: 43.3003079281
Unique values: 150
2. Sepal.Length
<snip>
csvファイルチェック
csvclean
- 列数が合ってるかなどのチェックをしてくれる。問題無ければ、**No errors.**と出力される
$ csvclean iris.csv
No errors.
csvから変換
csvjson
- JSONに変換してくれる
- -i オプションでインデントを指定したほうが見やすい
$ csvjson -i 2 iris.csv | head -n 20
[
{
"": "1",
"Sepal.Length": "5.1",
"Sepal.Width": "3.5",
"Petal.Length": "1.4",
"Petal.Width": "0.2",
"Species": "setosa"
},
{
"": "2",
"Sepal.Length": "4.9",
"Sepal.Width": "3",
"Petal.Length": "1.4",
"Petal.Width": "0.2",
"Species": "setosa"
},
{
"": "3",
"Sepal.Length": "4.7",
<snip>
csvsql -i
- MySQL等のSQL系への変換、サンプルを作ったり、テーブル名も変更してインサートできる
変換できるもの一覧
$ csvsql -h
<snip>
-i {access,sybase,sqlite,informix,firebird,mysql,oracle,maxdb,postgresql,mssql}, --dialect {access,sybase,sqlite,informix,firebird,mysql,oracle,maxdb,postgresql,mssql}
<snip>
mysqlにはこんな感じ
$ csvsql -i mysql iris.csv
CREATE TABLE iris (
_unnamed INTEGER NOT NULL,
`Sepal.Length` FLOAT NOT NULL,
`Sepal.Width` FLOAT NOT NULL,
`Petal.Length` FLOAT NOT NULL,
`Petal.Width` FLOAT NOT NULL,
`Species` VARCHAR(10) NOT NULL
);
csvに変換
in2csv
- エクセルファイル(.xlsx)からcsvへの変換。事業部からもらうデータが、xlsxのパターンが多く&そのままサーバにアップされてるとか超あるあるなので、実はかなり便利なのでは。
- Rで、read.xlsxしなくても良くなるかなー。
in2csv -f json
- -f オプションでjsonを指定することで、jsonファイルをcsvに変換できる。
- REST APIで取得したデータ(JSON形式)を瞬時にRとかで読み込みやすい形にできるのはとても便利。
sql2csv
- SQL系DBに保存されているものから、csvへの変換
- これもSQLの文法が分からない人などに軽く触ってもらうのに便利そう
おわりに
- デリミタは指定できるので、tsvファイルなどにも適用可能
- csvファイルの整形といえば、NYSOLもあるので、大きめのデータだと、それとの速度比較とか必要だけど、シンプルなのはcsvkitかなという印象。