加快批处理文件解析时间

时间:2018-10-29 22:18:36

标签: performance file parsing batch-file

我有一个批处理文件,该文件从多个csv文件读取并稍微清理数据,并使用清理后的数据创建另一个csv文件。它运行良好并且可以完成工作,但是速度很慢。您能帮忙加快速度吗? 2个文件约为2500 KB,一个文件约为25,000 KB。

这是批处理文件:

@echo "Cleansing TU DATA" &setlocal
set /p "header="<"SS1218 UBP FF TU.csv">"TU_UBP_SS1218.csv" echo.%header%
for /f "usebackq skip=1 delims=, tokens=1-3*" %%a in ("SS1218 UBP FF TU.csv") do (
  if "%%a" NEQ "MINMAX" (
    >>"TU_UBP_SS1218.csv" echo.%%a,%%b,%%c,%%d
  )
)
@echo "Cleansing EXP DATA"
set /p "header="<"SS1218_FF_UBP_EXP.csv">"EXP_UBP_SS1218.csv" echo.%header%
for /f "usebackq skip=1 delims=, tokens=1-3*" %%a in ("SS1218_FF_UBP_EXP.csv") do (
  if NOT "%%a" IN ("MINMAX", "TWOWAY") (
    >>"EXP_UBP_SS1218.csv" echo.%%a,%%b,%%c,%%d
  )
)

这是示例数据:

MINMAX,TU,ACXNDBK_RE,1.34537949,0,125,1607539
MINMAX,TU,ACXNDCLI_RE,0,0,0,1607539
MINMAX,TU,ACXNDCO_RE,6.0407280943,0,451,1607539
ONEWAY,TU,CS_H606_RE,700001-800000,7,0.0004354482
ONEWAY,TU,CS_H606_RE,800001-900000,3,0.0001866207
ONEWAY,TU,CS_H606_RE,900001-999998,3,0.0001866207
ONEWAY,TU,CS_H606_RE,999999,14,0.0008708964
ONEWAY,TU,CS_H606_RE,BLANKS,0,0
ONEWAY,TU,CS_H606_RE,I,0,0

基本上删除了所有MINMAX行,并在一个新文件中给了ONEWAY行。

2 个答案:

答案 0 :(得分:1)

@echo off
setlocal

@echo "Cleansing TU DATA"
set /p "header=" < "SS1218 UBP FF TU.csv"
> "TU_UBP_SS1218.csv" echo.%header%

(
  for /f "usebackq skip=1 delims=, tokens=1-3*" %%a in ("SS1218 UBP FF TU.csv") do (
    if "%%~a" NEQ "MINMAX" >&3 echo.%%a,%%b,%%c,%%d
  )
) 3>> "TU_UBP_SS1218.csv"

@echo "Cleansing EXP DATA"
set /p "header=" < "SS1218_FF_UBP_EXP.csv"
> "EXP_UBP_SS1218.csv" echo.%header%

(
  for /f "usebackq skip=1 delims=, tokens=1-3*" %%a in ("SS1218_FF_UBP_EXP.csv") do (
    if NOT "%%~a" == "MINMAX" if not "%%~a" == "TWOWAY" >&3 echo.%%a,%%b,%%c,%%d
  )
) 3>> "EXP_UBP_SS1218.csv"

设置变量header并在同一行上展开%header% 未使用即时值,因为%header%在 评估解析而不是执行解析。解决办法是打破 将线分成2行。

每个for循环都插入在括号和重定向之间 整个回声,所以它应该比文件更快 保持打开状态,直到括号块结束。

通过分别与每个值进行比较来固定"%%~a"的比较。

回显的数据正在使用流3,因此回显的代码可以是 使用echo on调试脚本进行查看。

答案 1 :(得分:1)

Michael shows how to speed up your existing code。但是还有更好的方法。

首先,我认为不需要单独处理标题行。您将排除以MINMAX或TWOWAY开头的行,而且我很确定您的标题行不会以这些值中的任何一个开头。

更重要的是,FINDSTR是一种 很多 更快的替代方法,用于过滤掉不需要的行。 /V选项排除与搜索匹配的行,而/B选项仅匹配每行的开头。搜索参数以空格分隔,因此第二个FINDSTR排除与任一字符串匹配的行。我在每个搜索字符串中都添加了逗号,以确保列值完全匹配,尽管我怀疑在您的情况下是否会有所不同。例如,在没有逗号的情况下,FINDSTR将排除以TWOWAYTWOWAYS开头的行。

@echo off
echo Cleansing TU DATA
findstr /v /b "MINMAX," "SS1218 UBP FF TU.csv" >"TU_UBP_SS1218.csv"
findstr /v /b "MINMAX, TWOWAY," "SS1218_FF_UBP_EXP.csv" >"EXP_UBP_SS1218.csv"