匿名質問者

CSVデータの整理作業を効率化したいです。


使用しているソフトウェア(スタンドアロンのアプリケーション)から
出力されるログデータの処理を行っています。

CSVのデータは
00:00:00,23.1
のように1つ目の項目に時刻、2つ目の項目に値が入っています。
行数は都度変わります。(60行であったり、100行であったり)

この出力されたCSVデータでExcelのAVERAGE関数を使って
値列の平均を求めていますが、これを自動作業で行おうとした場合、
どのような手段で行うのがよいでしょうか?マクロ?VB.NETで自作ソフト?

OSはWindows7、Officeは2010を使用しています。

おすすめがありましたら教えて頂けると嬉しいです。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/04/02 11:47:11

ベストアンサー

匿名回答2号 No.2

以下の内容を「average.jse」という名前のファイルに保存してください。
あとはaverage.jseのアイコンに、集計したいデータが入ったcsvファイルをドラッグ&ドロップすると平均を算出してメッセージボックスで表示してくれます。
メッセージボックスが表示されているときにCtrl+Cを押すことで、クリップボードにメッセージ内容を取得することができます。

var fso = new ActiveXObject("Scripting.FileSystemObject");
var oWArgv  = WScript.Arguments;

if (oWArgv.length == 0) {
  WScript.Echo("drag & drop file");
  WScript.Quit();
}

var path = oWArgv.item(0);

sum = 0;
cnt = 0;

var ts = fso.OpenTextFile(path);
while (!ts.AtEndOfStream) {
	var line = ts.ReadLine();
	sum += Number(line.split(",")[1]);
	cnt += 1;
}
ts.Close();

WScript.Echo(sum / cnt);
匿名質問者

ご回答の上、ソースコードまで・・ありがとうございます!
実施してみて平均も確かにでました。

自分でもアレンジできるよう、色々いじってみます。
ありがとうございました。

2014/04/02 11:45:09

その他の回答1件)

匿名回答1号 No.1

文字列処理に特化した処理系を使って良いのなら、
AWK等を覚えると良いと思います。
http://www.vector.co.jp/soft/win95/util/se376460.html

次のような感じで処理できます。
gawk "BEGIN{FS=\",\"}(/[0-9]/){sum=sum+$2;line=line+1}END{print sum/line}" log.csv

さらにこの結果を取り込んで高度な加工をしたい場合にはAWKの処理部分をファイルで記述することにより、ログの処理程度でしたらほとんどの事が可能です。

Windowsの流儀と異なるかもしれませんが、AWKは枯れていて仕様変更はありませんので、一度覚えるとずっとその知識が使えます。バージョンアップなどで新技術に振り回されるような事が無いです。

やはりWindowsですのであくまでExcel等をメインに仕様変化について行きつつ、変化が無くて長持ちする処理系も覚えておくといざという時に便利かと思います。

匿名質問者

回答ありがとうございました。
AWKは名前だけ聞いたことがあったので、紹介いただいて見てみました。
仕様変更がないのは確かに魅力的でした。

あとは、実行環境だったり操作する人間のスキルのハードルを
さげられたらなと思いました。

複数のメンバーが本作業を行う場面があり、このため、
CSVファイルを選んで…処理ボタンをぽちっと押したら
いつもAVERAGE関数を手打ちするところをさくっと実施してくれる!
みたいな方向にできたらなと思いました。

2014/04/01 16:50:03
匿名回答2号 No.2

ここでベストアンサー

以下の内容を「average.jse」という名前のファイルに保存してください。
あとはaverage.jseのアイコンに、集計したいデータが入ったcsvファイルをドラッグ&ドロップすると平均を算出してメッセージボックスで表示してくれます。
メッセージボックスが表示されているときにCtrl+Cを押すことで、クリップボードにメッセージ内容を取得することができます。

var fso = new ActiveXObject("Scripting.FileSystemObject");
var oWArgv  = WScript.Arguments;

if (oWArgv.length == 0) {
  WScript.Echo("drag & drop file");
  WScript.Quit();
}

var path = oWArgv.item(0);

sum = 0;
cnt = 0;

var ts = fso.OpenTextFile(path);
while (!ts.AtEndOfStream) {
	var line = ts.ReadLine();
	sum += Number(line.split(",")[1]);
	cnt += 1;
}
ts.Close();

WScript.Echo(sum / cnt);
匿名質問者

ご回答の上、ソースコードまで・・ありがとうございます!
実施してみて平均も確かにでました。

自分でもアレンジできるよう、色々いじってみます。
ありがとうございました。

2014/04/02 11:45:09
匿名質問者

質問者から

匿名質問者2014/04/02 16:20:38

2名の方ご回答ありがとうございました。

AWKをここで調べてみることになったのも貴重でしたし、

ソースコードまで記載いただくのもありがたかったです。

ベストアンサーについては悩みましたが、Windows環境ですぐ実行

可能な方へさせていただきましたが、どちらもありがたかったです。

ありがとうございました。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません