たぶんVBscriptについて質問です。

下記のようなテキストファイルを解析・集計したいと考えています。

2/20 10:00 A社訪問
2/20 11:00 B社入電
2/20 12:00 今期進捗についてMTG
2/21 12:00 C社訪問
2/21 15:00 D社来社
2/21 16:00 来期目標についてMTG

下記2点の要件が必要です。

1)頻出語を、「よく出る順」に並べる
2)日付でもフィルタリングできるようにする

期間ごとの頻出語推移なんかも追っていきたいと考えて
要件が相当ややこしくなりました。

これVBSで作れるんでしょうか?
もっといい方法はあるのでしょうか?

ちなみに社内の業務ログと連携させるので、パッケージソフトは使いづらいです。

回答の条件
  • 1人2回まで
  • 登録:2008/02/21 00:45:43
  • 終了:2008/02/28 00:50:02

回答(2件)

id:ardarim No.1

ardarim回答回数892ベストアンサー獲得回数1422008/02/21 02:22:15

ポイント35pt

マイクロソフトが提供しているLogParser 2.2を使ってみてはどうでしょうか。

任意の形式のログファイルを入力し、任意の形式(CSVなど)を出力できる、汎用のツールです。

集計はSQLライクの文法で行えます。


以下、C:\sample.txtにテストデータを入れた場合のサンプルです。


1)頻出語を、「よく出る順」に並べる

サンプル

C:\Program Files\Log Parser 2.2>logparser "SELECT Field3 AS 単語, COUNT(Field3) AS 摘要 FROM c:\sample.txt GROUP BY Field3 ORDER BY COUNT(Field3) DESC" -i:TSV -iSeparator:space -nSep:1 -fixedSep:ON -nFields:3 -headerRow:OFF -stats:OFF -o:CSV

実行例

摘要,頻度
A社訪問,3
今期進捗についてMTG,1
C社訪問,1
D社来社,1
来期目標についてMTG,1
B社入電,1

2)日付でもフィルタリングできるようにする

サンプル(2/20以前の日付を抽出)

C:\Program Files\Log Parser 2.2>logparser "SELECT Field1 AS 日付,Field2 AS 時刻,Field3 AS 摘要 FROM c:\sample.txt WHERE TO_TIMESTAMP(Field1,'m/d')<=TO_TIMESTAMP('2/20','m/d')" -i:TSV -iSeparator:space -nSep:1 -fixedSep:ON -nFields:3 -headerRow:OFF -stats:OFF -o:CSV

実行例

日付,時刻,摘要
2/20,10:00,A社訪問
2/20,11:00,B社入電
2/20,12:00,今期進捗についてMTG

参考:

Log Parserの概要 - @IT

id:freewriter

できました、ありがとうございます!

ただ。。コマンドプロンプト不慣れなのですが、出力結果をテキストか何かに保存するにはどうしたらよいのでしょうか?バッチで出来れば大変助かります。

それにしても凄いですね、LogParser。勉強して使いこなします。

2008/02/22 04:01:34
id:airplant No.2

airplant回答回数220ベストアンサー獲得回数492008/02/21 03:11:23

ポイント35pt

まず前提があります。

1)頻出語を、「よく出る順」に並べる

とは、自分で単語を定義するのですよね?

自動で単語を分析するには、相当大掛かりなプログラムを作らなくてはいけませんので、ここでは、自分で単語を定義するという前提で進めます。

>これVBSで作れるんでしょうか?

VBSでも他言語でも作れないことはないと思いますが、Excelで十分と思います。

きっと最後にExcelでグラフ化などするのでしょうから。

実はVBSだと結構なコーディング量になるので、Excelでも目的が達成できるならいいかと思った次第です。

WSHでScripting.Dictionaryを使った日付つきソートとかできればカッコウ良さそうですが。→作ってみてはいかが? アルゴリズムは簡単ですよ。


●考え方

 単に文章中の単語有無をcountifで見て、それを集計する

Step1.テキストファイルを読み込む

  A B
1 2008/2/20 10:00 A社訪問
2 2008/2/20 11:00 B社入電
3 2008/2/20 12:00 今期進捗についてMTG

Step2.分析がしやすいようにセルに名前をつけておく

例えば、行$1:$3を選択して「昨日」と右上にある名前ボックス欄に入れ、行$4~$7は「今日」にしておく。単位が大きいなら「上半期」など。


Step3.同一ブック内の新規シートに次のように式を入れる(下のシートをそのままExcelへ貼り付ける)

  A B C D
1 キー 昨日 今日 Sheet1!b:b
2 MTG =COUNTIF(INDIRECT(word),"*" & key & "*") =COUNTIF(INDIRECT(word),"*" & key & "*") =COUNTIF(INDIRECT(word),"*" & key & "*")

名前付けを行う(新規シートのほう)

$A:$A key

$1:$1 word


Step4.A列に単語を入れて、式を下にドラッグすれば単語出現数の表は完成

  A B C D
1 キー 昨日 今日 Sheet1!b:b
2 MTG 1 2 3
3 訪問 1 1 2
4 来期 0 2 2
5 A社 1 0 1
6 B社 1 0 1
7 C社 0 1 1
8 D社 0 1 1
9 入電 1 0 1
10 今期 1 0 1

Step5.全体の頻度順で見たいならD列を降順ソート。

なお、D列のb:bは見たい範囲を指定すればいいので、b1:b100のように指定可。


上の方法では、あくまで分析メッシュがあまり多くないことを想定しています。

もし、1日毎のグラフなどを作るのであれば、今度は下記のように単語を横にして後で日付で統合させれば、活用できそうです。

  A B C D E F G
1 日付 内容 A社 B社 C社 D社 訪問
2 2008/2/20 10:00 A社訪問 =IF(ISERROR(FIND(word,contents)),"",1) 同左・・・

名前付け:

$B:$B contents

$1:$1 word

id:freewriter

ご丁寧に、大変ありがとうございます。

ご説明が不足していましたが

業務が定型化していない状態での調査なので単語は定義できてません。。

が、ある程度傾向が見えてきたら現場で運用しやすいexcelに切り替えると良いかと思いました。

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

2008/02/22 04:10:04
  • id:ardarim
    バッチから実行するには、バッチにコマンドラインをそのまま入れればokです。
    例えば、(2)の例だと
    "C:\Program Files\Log Parser 2.2\logparser.exe" "SELECT Field1 AS 日付,Field2 AS 時刻,Field3 AS 摘要 FROM c:\sample.txt WHERE TO_TIMESTAMP(Field1,'m/d')<=TO_TIMESTAMP('2/20','m/d')" -i:TSV -iSeparator:space -nSep:1 -fixedSep:ON -nFields:3 -headerRow:OFF -stats:OFF -o:CSV > c:\filtered.txt
    をバッチファイルに書けばよいです。

    行末に「> 出力ファイル名」 を追加すると、指定の名前のテキストファイルとして出力できます。

    あとリンク先の@ITの記事に簡単に紹介されていますが、LogParserはVBScriptから直接呼び出すことも可能です。上記の通りバッチファイルからコマンド呼出でもできますが、複雑なことをやるのであればVBScriptでやったほうが良いかもしれません。
  • id:airplant
    LogParser、良さそうですね。今度使ってみたいですね。

    完全に誤解して、単語のほうに目がいっていました。
    「頻出語」というのは、記載されている「内容」そのままだったのですね。
    「A社訪問」と「A社来社」は、1件ずつと数えるのですね。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません