本日は、Ubuntuから離れて・・・EXCELで困っている方を救援すべく・・・。

ネタのEXCELファイルは預かっているので、まずは、私個人のPCで動作検証です。

UNIXのコマンドを、Windowsのコマンドプロンプトで実行できるように、ツールを導入してみました。

いくつか選択肢があるようですが、今回は「UnxUtils」( GNU utilities for Win32 – UnxUtils )を使用してみました。

ダウンロードは以下のサイトから。
UnxUtils | Free software downloads at SourceForge.net

ダウンロード後、UnxUtils.zip を、管理者権限で、C:\ に展開しました。

コマンドは、C:\UnxUtils\usr\local\wbin に格納されているので、どこでも使えるようにパスを通しておきます。

コントロールパネル → システム で、システム詳細をクリックし、「システムのプロパティ」画面を表示します。「詳細設定」タブを選択し、下部にある「環境変数」ボタンを押します。「システム環境変数」リストに存在する環境変数「Path」を「編集」します。変数名:「Path」に、変数値:「C:\UnxUtils\usr\local\wbin;」を追加し「OK」ボタンを押します。設定したパスを有効にする為に、いったんログオフ(または再起動)を実行。

Windowsのコマンドプロンプトを起動します。(メニュー → アクセサリ → コマンドプロンプト)

path を実行し、C:\UnxUtils\usr\local\wbin; が追加されていることを確認します。

20130318a試しに、cut コマンドの 使い方(help)を表示してみました。

 

 

 

 

 

20130318bEXCELで一月あたり2万行を超えるデータがあります。

原因は2分ごとに記録されたデータな為。

実際に必要なのは1時間ごとのデータで良いらしいので、不要な行を削除します。

まずはEXCELで、「ファイル」→「名前を付けて保存」で、「ファイルの種類」として「CSV(カンマで区切り)(*.csv)」を選択しCSVに変換して保存します。

それを、cat で表示してみました。 ・・・まあ、テキスト表示ぐらいなら、DOSの type コマンドで事足りるのですが・・・。
20130318c次に、grepコマンドで、”00:00:00”が含まれる行のみ抽出し表示させてみます。

うまく、必要な行のみ取り出せました。

実際には、1時間ごとに24時間分を抽出する必要があるので、-e オプションを複数記述して or 条件とします。

grep -e “00:00:00” -e “01:00:00” -e “02:00:00″ ・・・・・ -e “23:00:00” H25-2.csv

・・・もう少し、スマートな記述方法があるのでしょうが、今回はこれで行きます。

20130318dさらに、不要な列があるので、cut コマンドで削除してしまいます。

grepの出力を “|” (縦棒)でパイプし、cut コマンドに渡します。

オプション -d は、データの列の区切りとして ”,” を使うと言う意味。

オプション -f は、出力する列番号を複数指定しています。残りは捨てられます。

これで、ほぼ必要なデータを絞り込めるようになりました。

後は、使いやすいように、多少手を加えます。

sel1hr.bat と言うバッチファイルを作成しました。

内容は以下の通り

grep -e “00:00:00” -e “01:00:00” -e “02:00:00” -e “03:00:00” -e “04:00:00” -e “05:00:00” -e “06:00:00” -e “07:00:00” -e “08:00:00” -e “09:00:00” -e “10:00:00” -e “11:00:00” -e “12:00:00” -e “13:00:00” -e “14:00:00” -e “15:00:00” -e “16:00:00” -e “17:00:00” -e “18:00:00” -e “19:00:00” -e “20:00:00” -e “21:00:00” -e “22:00:00” -e “23:00:00” %1.csv | cut -d “,” -f 1,2,4,6,8,10,12,14 > %1-sel.csv

2013/03/20追記

grep コマンドの -G オプションで、正規表現を使いスマートに・・・。

grep -G [0-2][0-9]:00:00 %1.csv | cut -d “,” -f 1,2,4,6,8,10,12,14 > %1-sel.csv

コマンドプロンプトで、バッチファイルを実行する際、一つスペースを空けて、CSVファイル名を第1パラメータ(%1)として渡します。ファイル名は拡張子(.csv)なしで指定します。

C:\work>sel1hr H25-2

これを実行すると、grep コマンドで、H25-2.csv ファイルを読み込み、1時間ごとのデータ行を抽出します。それをパイプ(”|”)で cut コマンドに渡し、必要な列のみ抽出しします。それをリダイレクト(”>”)により、H25-2-sel.csv ファイルとして保存します。

2万行超えデータが、672行(本年2月分なので、24時間×28日=672時間/月)に一発変換できました。^^

PS:
UnxUtilsなしで、DOSコマンドだけなら?

grep は DOSコマンド findstr で代用可能。

findstr “00:00:00 01:00:00 02:00:00 03:00:00 04:00:00 05:00:00 06:00:00 07:00:00 08:00:00 09:00:00 10:00:00 11:00:00 12:00:00 13:00:00 14:00:00 15:00:00 16:00:00 17:00:00 18:00:00 19:00:00 20:00:00 21:00:00 22:00:00 23:00:00” %1.csv > %1-sel.csv

2013/03/20追記

findstr コマンドの /R オプションで、正規表現を使いスマートに・・・。

findstr /R [0-2][0-9]:00:00 %1.csv > %1-sel.csv

しかし、cut コマンド相当が、あるのかないのかよくわからん???

ないなら、上記で出力されたCSVファイルをEXCELで読み込み、不要な列を削除することで・・・。

もし、会社のPCに指定外のソフト(UnxUtils)を入れてはいけない規則だと言うのなら、この方法を薦めるとしましょう。(^^;