Ускорение времени разбора пакетного файла - PullRequest
0 голосов
/ 30 октября 2018

У меня есть командный файл, который читает из нескольких файлов CSV, немного очищает данные и создает другой файл CSV с очищенными данными. Он работает нормально и работает, но довольно медленно. Вы можете помочь ускорить это? 2 файла занимают около 2500 КБ, а один файл - около 25 000 КБ.

Вот командный файл:

@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 голосов
/ 30 октября 2018

Майкл показывает, как ускорить ваш существующий код . Но есть гораздо лучший способ.

Во-первых, я не думаю, что есть необходимость обрабатывать строки вашего заголовка отдельно. Вы исключаете строки, начинающиеся с MINMAX или TWOWAY, и я уверен, что строки заголовка не будут начинаться ни с одного из этих значений.

Что еще более важно, FINDSTR - это намного более быстрая альтернатива для фильтрации нежелательных строк. Параметр /V исключает строки, соответствующие запросу, а параметр /B соответствует только началу каждой строки. Аргумент поиска ограничен пробелом, поэтому второй FINDSTR исключает строки, совпадающие с любой строкой. Я добавил запятую к каждой строке поиска, просто чтобы убедиться, что значение столбца является точным соответствием, хотя я сомневаюсь, что в вашем случае это будет иметь значение. Например, без запятой FINDSTR исключит строки, начинающиеся с TWOWAY и TWOWAYS.

@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"
0 голосов
/ 30 октября 2018
@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 для отладки скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...