csvkitの使い方まとめ

## はじめに
- csvファイルをデータ分析のために簡単にハンドリング・クレンジングしてくれるためのオープン・ソースのツール
- pythonからインストール可能
- 公式ページのドキュメントが揃っているので、本格的に使うならそっちをチェックしてください。

## インストール
pipが使えるなら、下記1行でインストール可能

```
$ pip install csvkit
```

詳細は[公式ページ](https://csvkit.readthedocs.org/en/0.9.1/install.html#users)をご覧ください。　

## コマンド一覧
```
$ 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](http://www.nysol.jp/)もあるので、大きめのデータだと、それとの速度比較とか必要だけど、シンプルなのはcsvkitかなという印象。

## 参考
- [公式ページ](https://csvkit.readthedocs.org/en/0.9.1/)
- [csvkit を使ってみる](http://kshigeru.blogspot.jp/2012/06/csvkit.html)
- [データの前処理や加工に使えるPython csvkit](https://librabuch.jp/2014/12/python-csvkit/)
- [コマンドラインではじめるデータサイエンス](http://www.oreilly.co.jp/books/9784873117416/)