Help us understand the problem. What is going on with this article?

データの大掃除

More than 3 years have passed since last update.

DATUM STUDIO Advent Calendar 2016 13日目の記事です。

年末、大掃除をしたら、新年、気持ちよく迎えられる。

分析も同じです。

データ、お掃除して綺麗にしたら、分析、気持ちよくとりかかれる。

そこで、コマンドでのデータのお掃除(基礎的なもの)方法を紹介します。

  1. どんなデータなんだろう?(ls,head)
  2. 文字コードが違っていて見れない...(nkf)
  3. 不必要な文字が入っている...(grep)
  4. この行だけ必要なのに...(sed)
  5. この列いらない...(cut)
  6. データが大きすぎて他の分析ツールで読み込めないのだが!(split)

1.どんなデータなんだろう?

データをもらった時に、まずすることは、データの確認です。
お掃除の前に、まず確認です。

データのつくりを理解する

まずはlsコマンドでデータのつくりを確認しましょう。

$ ls -l data.csv

結果

-rw-r--r-- 1 daifuku_mochi2 mochi 105 12 03 23:30 data.csv
ファイル種別 アクセス権限 リンク数 所有者 所有グループ ファイルサイズ(バイト数) 最終更新日時 ファイル名
出力 - rw-r--r-- 1 daifuku_mochi2 mochi 105 12 03 23:30 data.csv
説明 -はファイルを表す 所有者は読み取り(read のr)書き込み(write のw)が可能。所有グループに属する人と、その他の人は読み取りのみ可能。 通常のファイルの場合は1 ファイル所有者 グループ名 105バイトですね。 眠くなる時間ですね 今回使用していくデータ名

ここで、データのサイズや、そもそも自分は書換える権限があるのか?等の確認ができます。

データの中身を確認しよう!

headコマンドで少しデータの中身を見てみましょう。

$ head data.csv          #head ファイル名

結果

01,1,??
02,2,??
03,3,aaa
04,4,??
05,5,??
06,6,??
07,7,??a
08,8,??
09,9,??
10,10,a??

データの一部を確認できました。

2.文字コードが違っていて見れない...

データは確認できましたが、文字化けしていて確認できませんでした。
そんな時はnkfコマンドで文字コードを確認しましょう。

まずは文字コードの確認

$nkf --guess sample.txt #nkf --guess ファイル名

結果

Shift_JIS (LF)

文字コードを変更しよう

Shift_JIS をUTF-8に変換します。

$nkf -w --overwrite sample.txt #nkf -変更したい文字コードを表す記号(Shift_JISなら"s",UTF-8なら"w"など) --ファイルを上書きするならoverwrite ファイル名

ここで、もう一度文字コードを確認してみると、

結果

UTF-8 (LF)

ちゃんと変更されていました!!
中を見てみましょう。

01,1,も
02,2,ち
03,3,aaa
04,4,も
05,5,ち
06,6,も
07,7,もa
08,8,も
09,9,ち
10,10,aち

これで中を見ることができました。

3.不必要な文字が入っている...

なんでところどころに"a"がはいっているんだ...意味がわからない...
そんな時ありますよね。
不必要な文字がついている行をgrepコマンドで削除することにします。

$ grep -v "a" data.csv    #grep -v "不必要な文字" ファイル名

結果

01,1,も
02,2,ち
04,4,も
05,5,ち
06,6,も
08,8,も
09,9,ち

grepは、検索パターンに一致した行を表示するコマンドです。
-v オプションを使用した場合、逆にパターンに一致しなかった行のみを表示します。

4.この行だけ必要なのに...

sedコマンドで必要な行を抽出します。

$sed -n '1,2p' data.csv   #sed -n '抽出したい行の開始行,抽出したい行の終了行' ファイル名

結果

01,1,も
02,2,ち

※$sed -e '3,9d' でも同じ結果が得られます。(指定行の削除)

5.この列いらない...

cutコマンドで削除しましょう。

$cat data.csv | cut -d "," -f 2-3  #cat ファイル名 | cut -d "ファイルの区切り文字" 表示させたい列

結果

1,も
2,ち
3,aaa
4,も
5,ち
6,も
7,もa
8,も
9,ち
10,aち

※区切り文字がtabの場合は、"-d"オプションは不要。

6.データが大きすぎて他の分析ツールで読み込めないのだが!

これくらいの大きさのファイルなら読み込めるのに...!
という時、splitコマンドが役立ちます。指定のバイト数で区切ることができます。

$split -b 50 data.csv  #split -b 一つのファイルあたりのバイト数 ファイル名

結果(ls -lで見ます)

-rw-r--r--@ 1 daifuku_mochi2 mochi 105 12 03 23:30 data.csv
-rw-r--r-- 1 daifuku_mochi2 mochi 50 12 12 23:27 xaa
-rw-r--r-- 1 daifuku_mochi2 mochi 50 12 12 23:27 xab
-rw-r--r-- 1 daifuku_mochi2 mochi 5 12 12 23:27 xac

3つのファイルが出力されました。
105バイトあったdata.csvは、50バイト,50バイト,5バイトと分割されていることがわかります。

まとめ

大きなデータでファイルが開けないので手作業が難しい、
手作業は煩わしい、ミスをしてしまうことが不安だ
というような時、コマンドでの処理はとても便利です。
ここで紹介したコマンドは、上記以外にもたくさんの便利なオプションがあります。
manコマンド を詳しく知りたいコマンドと一緒に打ってみてください。
コマンドお掃除で、よいお年を!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away