Выведите пустую / пустую строку / разделительную строку в текстовый файл - PullRequest
1 голос
/ 02 ноября 2019

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

  SET "_LogFile=C:\Test.log"
  SET "_ResultFile=OutPut.txt"
  SET "_MatchString_Begin=<Line Text="***********TEST************"
  SET "_MatchString_End=</Report>"
  SET "_Line#_Begin="
)

CALL :Main

( ENDLOCAL
  EXIT/B
)
:Main
CLS
  IF EXIST "%_ResultFile%" (
    DEL /F /Q "%_ResultFile%"
  )
  COLOR 0F
  ECHO.&ECHO.===== Processing =====&ECHO.
  FOR /F "Delims=[]" %%# IN ('
    Find /N "%_MatchString_Begin:"=""%" "%_LogFile%" ^| FIND "["
  ') DO (
    ECHO. Found Match On Line %%#
    SET /A "_Line#_Begin=%%#-1"
    CALL :Output
  )
  COLOR 20
  ECHO.&ECHO.===== Completed! =====

FOR /F tokens^=2^ delims^=^" %%I in ('type "%_ResultFile%" ^& ^> "%_ResultFile%" rem/') do (
    >> "%_ResultFile%" echo(%%I
)

REN %_ResultFile% Trythis.csv

START TryThis.csv

GOTO :EOF

:Output
  FOR /F "SKIP=%_Line#_Begin% Tokens=* usebackq" %%_ IN (
    "%_LogFile%"
  ) DO (
    ECHO(%%_
    ECHO("%%_" | FIND /I "%_MatchString_End%" >NUL&&(
      GOTO :EOF
    )
  )>>"%_ResultFile%"
GOTO :EOF


В моем экспорте я получаю:

AAA
AAA
AAA
BBB
BBB
BBB
CCC
CCC
CCC

Было бы приятно увидеть:

 AAA
 AAA
 AAA
 ---
 BBB
 BBB
 BBB
 ---
 CCC
 CCC
 CCC

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

Любые предложения будут НАМНОГО оценены!

Ответы [ 2 ]

0 голосов
/ 02 ноября 2019

Добавьте эту строку:

echo/>>"%_ResultFile%"

сразу после этой строки:

CALL :Output

внутри цикла for.

Но я не уверен, чтоэтот цикл for даже делает, так что он может испортить это:

FOR /F tokens^=2^ delims^=^" %%I in ('type "%_ResultFile%" ^& ^> "%_ResultFile%" rem/') do (
    >> "%_ResultFile%" echo(%%I
)
0 голосов
/ 02 ноября 2019

Я думаю, вам просто нужно поместить его в раздел: output следующим образом:

:Output
FOR /F "SKIP=%_Line#_Begin% Tokens=* usebackq" %%_ IN ("C:\Test.log") DO (
   ECHO(%%_
   ECHO("%%_" | FIND /I "%_MatchString_End%" >NUL&&ECHO(&&(GOTO :EOF)
)>>"%_ResultFile%"

Ваш полный код, изменяющий кучу вещей так, как я бы с большей вероятностью это сделал. Я знаю, что Mofi действительно не нравится echo. - но я работаю с компьютерами, которые у меня есть, и я не беспокоюсь о крошечной вероятности проблем. Если вы заботитесь об этом, вы можете заменить все echo. на echo/

SET "_MatchString_Begin=<Line Text="**TEST**"
SET "_MatchString_End=</Report>"
SET "_Line#_Begin="   

ECHO.
ECHO ===== Processing =====
ECHO.
FOR /F "Delims=[]" %%a IN ('Find /N "%_MatchString_Begin:"=""%" "C:\Test.log" ^| FIND "["') DO (
   ECHO Found Match On Line %%a>>"%_ResultFile%"
   SET /A "_Line#_Begin=%%a-1"
   rem CALL :Output   I do not understand what this line is doing here.
   rem :Output I also do not understand what this line is doing here.
   FOR /F "SKIP=%_Line#_Begin% Tokens=* usebackq" %%b IN ("C:\Test.log") DO (
      ECHO.%%b>>"%_ResultFile%"
      rem the next line is the blank line if you want it after every line in test.log
      ECHO.>>"%_ResultFile%"
      rem the next line also adds a blank line after finding the ending matching string
      ECHO.%%b^| FIND /I "%_MatchString_End%" >NUL && (
         rem what to do when we match the end string
         rem blank line here if this is where you want it
         echo.>>"%_ResultFile%"
         GOTO :EOF
      )
   )
)
GOTO :EOF

Я считаю, что перенаправление каждой строки в выходной файл более понятно, чем перенаправление всего выводаfor выписка в файл. Это приводит к повторному коду - но у вас есть возможность перенаправлять на несколько файлов или просто выводить на консоль.

Кроме того, я все еще не думаю, что это ваш настоящий код. Я должен был добавить скобки здесь и там. Возможно, секция: output должна была быть вне начального for цикла ??

Вот что я думаю, что ваш код должен быть:

SET "_MatchString_Begin=<Line Text="**TEST**"
SET "_MatchString_End=</Report>"
SET "_Line#_Begin="   

ECHO.
ECHO ===== Processing =====
ECHO.
FOR /F "Delims=[]" %%a IN ('Find /N "%_MatchString_Begin:"=""%" "C:\Test.log" ^| FIND "["') DO (
   ECHO Found Match On Line %%a
   SET /A "_Line#_Begin=%%a-1"
   CALL :Output
   echo.>>"%_ResultFile%"
)
goto :eof

:Output
FOR /F "SKIP=%_Line#_Begin% Tokens=* usebackq" %%b IN ("C:\Test.log") DO (
   ECHO.%%b>>"%_ResultFile%"
   ECHO.%%b| FIND "%_MatchString_End%" >NUL && GOTO :EOF
)
GOTO :EOF

В конечном счете, я бы не стал перебирать файл снова и снова. Вот что я бы сделал: UNTESTED Может легко быть незначительными ошибками, такими как пропуск ^.

@echo off
SET "_MatchString_Begin=<Line Text="**TEST**"
SET "_MatchString_End=</Report>"
SET "_Line#_Begin="

:: output_flag is used to decide if the lines should be output or not
SET "output_flag=N"
cls

ECHO.
ECHO ===== Processing =====
ECHO.
FOR /F "usebackq tokens=*" %%a IN ("C:\Test.log") DO (
   ECHO.%%a|find "%_MatchString_Begin:"=""%"  && set "output_flag=Y"
   if "!output_flag!"=="Y" echo.%%a>>"%_ResultFile%"
   echo.%%a|find "%_MatchString_End%" >nul &&echo.>>"%_ResultFile%"&&set "output_flag=N"
)
...