Page 1 of 1

[SOLVED] Batch to Parse tags from .log file

Posted: 09 Mar 2014 15:34
by Dos_Probie
I have never had the need to parse files using a batch, have googled around but cannot seem to find
any appropriate documention on this (found something on perl but rather stick to a batch) and now need some direction please.
This is an snippet example of text in my Results.log file (total of 28 lines) below.

<td><label>IP Address</label></td>
<td><label>90.167.72.49</label></td>
<td><label for="chkCountry">Country</label></td>
<td><label for="chkCountry">UNITED STATES</label></td>
<td><label for="chkNetSpeed">Net Speed</label></td>
<td><label for="chkNetSpeed">DSL</label></td>

Would like to parse or extract the End tags </label></td> (which are all the same on each line)
and then the Start tags (which vary per info) <td><label>, <td><label for="chkCountry">, <td><label for="chkNetSpeed"> etc.
When done parsing out the tags then update the Results.log or just del old and create new EndResult.txt file.
Can this be done? If so then Thanks for any help or info on this..DP

Re: Batch to Parse tags from .log file

Posted: 09 Mar 2014 16:15
by Squashman
Most likely can be done in pure batch but MS made a utility for things like this. Although I am sure REPL and FINDREPL would work quite nicely.
http://www.microsoft.com/en-us/download ... x?id=24659

Re: Batch to Parse tags from .log file

Posted: 09 Mar 2014 16:40
by Dos_Probie
Thanks for the info Squashman!, I failed to mention that my OS will either be Windows 7 or 8 and the System requirements
for Log Parser is "only compatible with the Windows® 2000, Windows® XP Professional, and Windows ServerTM 2003 operating systems." , Have SSED which was able to gleam 248 lines down to 28 but don't see where it has the ability to parse, so pure batch would probably work, just need pointing in right direction..DP

Re: Batch to Parse tags from .log file

Posted: 09 Mar 2014 17:26
by Dos_Probie
I got this code to find a specified text now just need to figure out how to remove it and ability to add multiple specified text files..

Code: Select all

@echo off
:: Search for specified text in log file
set "log=IP.RESULTS.log"

findstr /m "</label></td>" %log%
if %errorlevel%==0 (
echo.
echo Found!
) else (
echo No matches found
)
pause>nul

Re: Batch to Parse tags from .log file

Posted: 09 Mar 2014 19:00
by foxidrive
<td><label>IP Address</label></td>
<td><label>90.167.72.49</label></td>
<td><label for="chkCountry">Country</label></td>
<td><label for="chkCountry">UNITED STATES</label></td>
<td><label for="chkNetSpeed">Net Speed</label></td>
<td><label for="chkNetSpeed">DSL</label></td>

Would like to parse or extract the End tags </label></td> (which are all the same on each line)
and then the Start tags (which vary per info) <td><label>, <td><label for="chkCountry">, <td><label for="chkNetSpeed"> etc.
When done parsing out the tags then update the Results.log or just del old and create new EndResult.txt file.


Show us what you need to get from the above.

Re: Batch to Parse tags from .log file

Posted: 09 Mar 2014 21:35
by Dos_Probie
Thanks for the Reply Foxi, here is what I Need to KEEP from my snippet with spacing for readability...
IP Address
90.167.72.49

Country
UNITED STATES

Net Speed
DSL

also this is what I have so far, but its slow and the special characters ( </ ) are a issue with enabledelayedexpansion..

Code: Select all

@echo off
setlocal enabledelayedexpansion
set "log=RESULTS.log"
set "log2=RESULTS_Rev.txt"

FOR /F "usebackq delims=" %%G IN ("%log%") DO (
Set "line=%%G" & echo !line:label for=!
)>>"%log2%"

Re: Batch to Parse tags from .log file

Posted: 09 Mar 2014 21:43
by Aacini

Code: Select all

@echo off
setlocal

set "log=RESULTS.log"
set "log2=RESULTS_Rev.txt"

(FOR /F "usebackq tokens=3 delims=<>" %%G IN ("%log%") DO (
   echo %%G
)) > "%log2%"


Antonio

Re: Batch to Parse tags from .log file

Posted: 09 Mar 2014 21:44
by foxidrive
Using Dave Benham's repl.bat

Code: Select all

@echo off
type "file.htm"|repl ".*<td><label.(.*)</label>.*" "$1" i |repl "^for.*\q>" "" xi |repl "^(IP Address|Country|Net Speed)$" "\r\n$1" x
pause


Output:


IP Address
90.167.72.49

Country
UNITED STATES

Net Speed
DSL
Press any key to continue . . .




This uses a helper batch file called `repl.bat` - download from: https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

Place `repl.bat` in the same folder as the batch file or in a folder that is on the path.

Re: Batch to Parse tags from .log file

Posted: 10 Mar 2014 05:44
by dbenham
Here is a simpler and more generic way to do it with REPL.BAT.

Code: Select all

type results.log|repl "<.*?>" ""|repl "(.*\n.*\n)" "$1\r\n" mx >results.log.new
move /y results.log.new results.log >nul

The first REPL removes all tags. The second REPL inserts an extra linefeed every other line.

Edit
Here is a slightly simpler version (saves 2 characters :wink: )

Code: Select all

type results.log|repl "<.*?>" ""|repl ".*\n.*\n" "$&\r\n" mx >results.log.new
move /y results.log.new results.log >nul

The original post of REPL.BAT is at viewtopic.php?f=3&t=3855


Dave Benham

Re: Batch to Parse tags from .log file

Posted: 10 Mar 2014 06:30
by Squashman
Dos_Probie wrote:Thanks for the info Squashman!, I failed to mention that my OS will either be Windows 7 or 8 and the System requirements
for Log Parser is "only compatible with the Windows® 2000, Windows® XP Professional, and Windows ServerTM 2003 operating systems." , Have SSED which was able to gleam 248 lines down to 28 but don't see where it has the ability to parse, so pure batch would probably work, just need pointing in right direction..DP

How often have you bought a piece of software well before an operating system came out and it still worked 10 years later when a new operating system comes out.

Re: Batch to Parse tags from .log file

Posted: 10 Mar 2014 07:31
by Dos_Probie
@Squashman, your right just cause it says it won't work a lot of times it will, anyway thanks for the input
and big Thanks to Dave and Foxi for the replace.bat (didn't know about that one) and code, I will be adding this
to my main batch code and then report back with the results and a download if anyone is interested. Thanks again
DP :D
P.S (Thanks also to Aacini and penpen for the input as well!)

EDIT:
OK, got this working 100% now! so big thanks again for all the help on this and the info on the repl.bat file as well, below is
a summary of the Geo ISP output which reads off a java script file to a specified geolocation service for your local machine
then uses the ssed.exe file to parse all of the .xml information from 445 lines down to only 28 lines then uses the Dos Tips file
repl.bat to pull out all the code tags, taking less that 15 sec to run, The file size is only 113kb and is uploaded on a cloud account,
if anyone is interested in trying this out just pm me for the d/l link..Thanks again DP :D

Sample Summary:
IP Address
90.167.72.49

Country
UNITED STATES

Region & City
FLORIDA, NAPLES

Latitude & Longitude
+20.092056, -61.719187

ZIP Code
34116

ISP
COMCAST CABLE COMMUNICATIONS HOLDINGS INC

Domain
COMCAST.NET

Time Zone
-05:00

Net Speed
DSL

IDD Code & Area Code
+1237

Weather Station
NAPLES (USFL0338)

Mobile MCC, MNC, & Carrier name
-

Elevation
2

Usage Type
ISP

========== END OF ISP SUMMARY - [Tue 03/11/2014 @ 05:06 PM] ==========

Re: Batch to Parse tags from .log file

Posted: 11 Mar 2014 00:36
by penpen
If you are have to extract multiple informations from tagged data, you also may use JScript to perform xml/xslt:
"test.bat":

Code: Select all

@echo off
cls
setlocal enableDelayedExpansion
set "empty="

:: The name of the root elements doesn't matter, there must be only one
:: Assumed this is a default text file
> result.xml echo(^<root^>
copy result.xml /B + result.log /B result.xml
>> result.xml echo(^</root^>

(
   echo(^<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"^>
   echo(
   echo(^<xsl:output method="text" encoding="UTF-8"/^>
   echo( ^<xsl:template match="label"^>
   echo(  ^<xsl:copy-of select="."/^>^<xsl:text^>^&#13;^&#10;^</xsl:text^>
   echo( ^</xsl:template^>
   echo(^</xsl:transform^>
) > resultExtract.xsl

call xslt.bat "result.xml" "resultExtract.xsl" "result.txt"

:: if result.log has a root element, you may use it without another temp file
::xslt.bat "result.log" "resultExtract.xsl" "result.txt"

:: i haven't deleted the files for debug reasons
endlocal
goto :eof

"xslt.bat":

Code: Select all

@if (true==false) then /*
@echo off
cscript //nologo //e:JScript "%~f0" %*
exit /b %errorlevel%
*/
@end


function loadXmlFile (strFileName) {
   var xmlObject = xmlObject = new ActiveXObject ("msxml2.DOMDocument.6.0");      // try instanciating MSXML 6.0 object
   if (xmlObject == null) {
      xmlObject = new ActiveXObject  ("Msxml2.DOMDocument.3.0");         // try instanciating MSXML 3.0 object
      if (xmlObject == null) {
         WScript.echo ("Error: Could not instanciate MSXML 3.0/6.0.");      // echo error hint
         return null;
      }
   }

   xmlObject.async = false;                        // disable asynchronuous reading
   xmlObject.validateOnParse = false;                     // disable parser validating document
   xmlObject.load (strFileName);                        // load file content
   if (xmlObject.parseError.errorCode != 0) {
      WScript.Echo ("Parse error: " + xmlObject.parseError.reason);
      return null;
   }

   return xmlObject;
}

function xslt (sourceXml, sourceXslt, target) {
   var objFileSystem = new ActiveXObject ("Scripting.FileSystemObject");         // create file system object handle
   var objXML = loadXmlFile (sourceXml);                     // create input xml file handle
   var objXSL = loadXmlFile (WScript.arguments (1));               // create input xsl file handle

   try {
      strResult = objXML.transformNode (objXSL);               // creating output txt file content
      var objOutFile = objFileSystem.createTextFile (WScript.arguments (2), true);   // create output txt file handle
      objOutFile.write (strResult);                     // writing content to file
      objOutFile.close ();                        // flush and close txt file
   } catch (exception) {
      WScript.echo ("XSL Transformation failed.");
   }
}

if (WScript.Arguments.Unnamed.Length != 3) {
   WScript.echo ("Usage: xslt <input xml file> <input xsl file> <output txt file>");
   WScript.quit (1);
} else {
   xslt (WScript.arguments (0), WScript.arguments (1), WScript.arguments (2));
   WScript.quit (0);
}

penpen

Edit: Added a missing "call" in test.bat

Re: [SOLVED] Batch to Parse tags from .log file

Posted: 12 Mar 2014 05:46
by pieh-ejdsch
To extract text from HTML or XML you can use this simple pure Batchscript http://www.administrator.de/forum/html-dateien-nach-bestimmten-strings-auslesen-und-in-textdatei-speichern-180748.html#comment-733852

Code: Select all

@echo off&setlocal
pushD "%~dp0"
if "%~1" equ "" rd & goto :eof
if "%~1" neq "/?" if /i "%~1" neq "/help" goto :NoHelp
Echo Seperate Ausgabe von Code und Text ^(Text unformatiert^)
Echo(
Echo Syntax: "%~n0" [Laufwerk:][Pfad]Dateiname
Echo(
Echo HTML-Code Extractor nach "Dateiname.Code.txt"
Echo HTML-Text Extractor nach "Dateiname.txt"
Echo(
pause&goto :eof
:NoHelp
if not exist "%~1" echo Datei "%~1" nicht gefunden.& exit /b1
set "File=%~1"
Type nul>"%File%.Code.txt"
type nul>"%File%.TXT"
set /a Nr =0

:startNLine
set /a Nr +=1
for /f "usebackq delims=" %%i in ("%File%") do (set /a Nr+=1
   set /a Index =0
   set "Line=%%i"
   call :start
)
set HText&pause&goto :eof

:start

set /a Index +=1
set "Line1="
set "Text="
setlocal enabledelayedexpansion

for /f "tokens=1,* delims=<" %%i in (" !Line!") do endlocal&(if not "%%i" == " " set "Line1=%%i"
   set "Line=<%%j"
)

if not defined Line1 goto :NoLine1
setlocal enabledelayedexpansion
set "Text=!Line1:~1!"
(
for /f "eol= tokens=* delims=" %%i in ("!Text!") do endlocal&set "Text=%%i"
)||endlocal
:NoLine1
set "Line2="
setlocal enabledelayedexpansion
for /f "tokens=1,* delims=>" %%i in (" !Line!") do endlocal&(if not "%%i" == " " set "Line2=%%i>"
   set "Line=%%j"
)

setlocal enabledelayedexpansion
set "Line2=!Line2:~1!"
(
for /f "eol= tokens=* delims=" %%i in ("!Line2!") do endlocal&if not "%%i" == "<>" (
   set "HTag:%Nr%:%Index%=%%i"
   echo HTMCode   : %%i
)>>"%File%.Code.txt"
)||endlocal

:NoLine

setlocal enabledelayedexpansion
(
for /f "eol= tokens=* delims=" %%i in ("!Text!") do (endlocal
   echo\%%i
   set "HText:%Nr%:%Index%=%%i"
   set "Text="
)>>"%File%.TXT"
)||endlocal

::hier müsste dann die Extrabehandlung herein

if defined Line (goto :Start) else goto :eof


This splits: for example
a HTML file to one Text file and one HTML-Code file
usage:
Batch.cmd "File-with-code-tags.ext"

Phil