本日は、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; が追加されていることを確認します。
試しに、cut コマンドの 使い方(help)を表示してみました。
原因は2分ごとに記録されたデータな為。
実際に必要なのは1時間ごとのデータで良いらしいので、不要な行を削除します。
まずはEXCELで、「ファイル」→「名前を付けて保存」で、「ファイルの種類」として「CSV(カンマで区切り)(*.csv)」を選択しCSVに変換して保存します。
それを、cat で表示してみました。 ・・・まあ、テキスト表示ぐらいなら、DOSの type コマンドで事足りるのですが・・・。
次に、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
・・・もう少し、スマートな記述方法があるのでしょうが、今回はこれで行きます。
さらに、不要な列があるので、cut コマンドで削除してしまいます。
grepの出力を “|” (縦棒)でパイプし、cut コマンドに渡します。
オプション -d は、データの列の区切りとして ”,” を使うと言う意味。
オプション -f は、出力する列番号を複数指定しています。残りは捨てられます。
これで、ほぼ必要なデータを絞り込めるようになりました。
後は、使いやすいように、多少手を加えます。
sel1hr.bat と言うバッチファイルを作成しました。
内容は以下の通り
2013/03/20追記
grep コマンドの -G オプションで、正規表現を使いスマートに・・・。
コマンドプロンプトで、バッチファイルを実行する際、一つスペースを空けて、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 で代用可能。
2013/03/20追記
findstr コマンドの /R オプションで、正規表現を使いスマートに・・・。
しかし、cut コマンド相当が、あるのかないのかよくわからん???
ないなら、上記で出力されたCSVファイルをEXCELで読み込み、不要な列を削除することで・・・。
もし、会社のPCに指定外のソフト(UnxUtils)を入れてはいけない規則だと言うのなら、この方法を薦めるとしましょう。(^^;