http://www.microsoft.com/technet/scriptcenter/tools/logparser/default.mspx

https://technet.microsoft.com/en-us/scriptcenter/dd919274.aspx

- Of course, windows only
- Very incomplete, proof of concept only
- SQL like query definition
- output to a file, console, chart, Database
- multiple text files treated as a single set of data
- handles various input file types (CSV, TSV, XML,etc)
- much more...
screenshot:
Step 1, Get the sample data:
http://www.briandunning.com/sample-data/Make sure you convert the sample file to DOS format CR+LF (Its original format is Unix format so LF only for line termination)file: us-500.zip (which contains us-500.csv)
You can do that by opening in excel and then overwriting to CSV format, or change the format with your favorite text editor.
Step 2, Prepare your query in a separate file
filename: query.sql, contents:
SELECT first_name,last_name,city FROM us-500.csv WHERE state = 'CA'
Dependecies in this example:
- the path to LogParser is hard-coded "C:\Program Files (x86)\Log Parser 2.2"
- the default query file called "query.sql" mentioned above
console show set types {*.sql} proc invoke command { global fh set fh [open |$command r+] set stdout [read $fh] set stderr {} set status [catch {close $fh} stderr e] if {$status} { dict with e {} lassign [set -errorcode] sysmsg pid exit if {$sysmsg eq {NONE}} { #output to stderr caused [close] to fail. Do nothing } elseif {$sysmsg eq {CHILDSTATUS}} { return [list $stdout $stderr $exit] } else { return -options $e $stderr } } return [list $stdout $stderr 0] } proc e'get name { if [file exists $name] { set f [open $name] set ::g(filename) $name K [read $f] [close $f] } else {corp $name} } proc K {a b} {set a} proc showSQL sqlFile { .ctrls.qryPath delete 0 end .ctrls.qryPath insert end $sqlFile .ctrls.sql delete 1.0 end foreach line [split [e'get $sqlFile] \n] { .ctrls.sql insert end $line\n } } proc Run {} { global fh log but command header query puts [pwd] $log delete 1.0 end set results [invoke "\"C:/Program Files (x86)/Log Parser 2.2/LogParser.exe\" \ -i:CSV \ \"[.ctrls.sql get 1.0 end]\" \ -headerRow:ON"] $log insert end "[lindex $results 0]" $log insert end "[lindex $results 1]" #$log see end } frame .t frame .ctrls set log [text .t.log -width 80 -height 30 \ -borderwidth 2 -relief raised -setgrid true \ -yscrollcommand {.t.scroll set}] scrollbar .t.scroll -command {.t.log yview} canvas .c -height 20 -width 640 set but [button .ctrls.run -text "run" -command Run] button .ctrls.qry -text "Select Query..." -command { set query [tk_getOpenFile -filetypes [list [list "All files" $types]]] showSQL $query } entry .ctrls.qryPath -width 50 button .quit -text "exit" -command exit text .ctrls.sql -width 40 -height 10 pack .quit pack .t.scroll -side right -fill y pack .t.log -side left -fill both -expand true pack .t -side top -fill both -expand true pack .c grid .ctrls.qry .ctrls.qryPath grid .ctrls.run .ctrls.sql pack .ctrls #default header file set header "[pwd]/header.txt" #default query file set query "[pwd]/query.sql" if [file exists $query] { .ctrls.qryPath insert end $query showSQL $query } else { tk_messageBox -message "There is no default query file defined\n ($query was expected)" }
See also:
Fetching backrefs for current page...