parsing - 加快我的批处理文件解析

标签 parsing batch-file

我有一个批处理文件,它从一个看起来像这样的 txt 文件中获取输入。

Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved.


Server name lak-print01
Printer name Microsoft XPS Document Writer
Share name 
Driver name Microsoft XPS Document Writer
Port name XPSPort:
Comment 
Location 
Print processor WinPrint
Data type RAW
Parameters 
Attributes 64
Priority 1
Default priority 1
Average pages per minute 0
Printer status Idle 
Extended printer status Unknown 
Detected error state Unknown 
Extended detected error state Unknown 

Server name lak-print01
Printer name 4250_Q1
Share name 4250_Q1
Driver name Canon iR5055/iR5065 PCL5e
Port name IP_192.168.202.84
Comment Audit Department in Lakewood Operations
Location Operations Center
Print processor WinPrint
Data type RAW
Parameters 
Attributes 10826
Priority 1
Default priority 0
Average pages per minute 0
Printer status Idle 
Extended printer status Unknown 
Detected error state Unknown 
Extended detected error state Unknown 

Server name lak-print01
Printer name 3130_Q1
Share name 3130_Q1
Driver name Canon iR1020/1024/1025 PCL5e
Port name IP_192.168.202.11
Comment Canon iR1025 
Location Operations Center
Print processor WinPrint
Data type RAW
Parameters 
Attributes 10824
Priority 1
Default priority 0
Average pages per minute 0
Printer status Idle 
Extended printer status Unknown 
Detected error state Unknown 
Extended detected error state Unknown 

并解析它以获取列表中的某些内容,例如服务器名称、打印机名称、驱动程序名称等。然后将每个块条目放入其自己的逗号分隔行中。所以我可以有多行,每一行代表一个文本块,每一列都有特定的信息。其中一些 txt 文件有 100 多个条目。解析时,我尝试解析的每个文件都需要 5-10 分钟

解析代码如下。
:Parselak-print01
SETLOCAL enabledelayedexpansion
:: remove variables starting $
FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="
(FOR /f "delims=" %%a IN (lak-print01.txt) DO CALL :analyse "%%a")>lak-print01.csv
attrib +h lak-print01.csv
GOTO :EOF

:analyse
SET "line=%~1"
SET /a fieldnum=0
FOR %%s IN ("Server name" "Printer name" "Driver name"
            "Port name" "Location" "Comment" "Printer status" 
        "Extended detected error state") DO CALL :setfield %%~s
GOTO :eof

:setfield
SET /a fieldnum+=1
SET "linem=!line:*%* =!"
SET "linet=%* %linem%"
IF "%linet%" neq "%line%" GOTO :EOF 
IF "%linem%"=="%line%" GOTO :EOF
SET "$%fieldnum%=%linem%"
IF NOT DEFINED $8 GOTO :EOF 
SET "line="
FOR /l %%q IN (1,1,7) DO SET "line=!line!,!$%%q!"
ECHO !line:~1!
:: remove variables starting $
FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="
GOTO :eof

我得到的输出是
lak-print01,Microsoft XPS Document Writer,Microsoft XPS Document Writer,XPSPort:,,,Idle 
lak-print01,4250_Q1,Canon iR5055/iR5065 PCL5e,IP_192.168.202.84,Operations Center,Audit Department in Lakewood Operations,Idle 
lak-print01,3130_Q1,Canon iR1020/1024/1025 PCL5e,IP_192.168.202.11,Operations Center,Canon iR1025 ,Idle 
lak-print01,1106_TRN,HP LaserJet P2050 Series PCL6,IP_172.16.10.97,Monroe,HP P2055DN,Idle 
lak-print01,1101_TRN,HP LaserJet P2050 Series PCL6,IP_10.3.3.22,Burlington,Training Room printer,Idle 
lak-print01,1096_Q3,Canon iR1020/1024/1025 PCL5e,IP_192.168.96.248,Silverdale,Canon iR 1025,Idle 
lak-print01,1096_Q2,Kyocera Mita KM-5035 KX,IP_192.168.96.13,Silverdale,Kyocera CS-5035 all in one,Idle 
lak-print01,1096_Q1,HP LaserJet P4010_P4510 Series PCL 6,IP_192.168.96.12,Silverdale,HP 4015,Idle 
lak-print01,1095_Q3,HP LaserJet P4010_P4510 Series PCL 6,IP_192.168.95.247,Sequim,HP LaserJet 4015x,Idle 

一切都很完美,代码按预期工作......但它只是 super 慢!

我如何加快速度?问题是没有真正的 delim 并且 token 各不相同。例如,评论需要 token 2,但打印机名称需要 token 3。

任何有助于提高解析速度的帮助......该程序运行良好,但在解析过程中速度非常慢。

最佳答案

如果您需要速度,我建议 Marpa ,一个通用的 BNF 解析器,in Perlcode , output .

这需要一些时间来适应,但它可以完成工作并为您提供一个非常强大的工具,您可以轻松使用 - 请注意语法与输入的相似程度。

希望这可以帮助。

关于parsing - 加快我的批处理文件解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26107314/

相关文章:

c - 解析具有名称、十六进制值等的字符串的最佳方法是什么?

python - 如何解析具有多个根元素的xml

batch-file - 批处理文件编辑Hosts文件-没有效果?

windows - 如何重新评估批处理变量?

c# - 如何在执行完成后立即终止sqlcmd?

windows - 从 ping 获取主机名并将结果存储到文本

iphone - iOS 中的 CSV 逐行解析

VBA HTML 抓取 - 来自复杂表的 '.innertext'

linux - 在 Python3 中使用 HTMLParser 解析 HTML

msbuild - msbuild 中的双循环?