У меня есть файл интерфейса, например, с именем RawData.txt, который содержит различные области данных, которые могут варьироваться от нескольких тысяч строк до 100 000 строк данных.

Есть смесь строк, которые содержат, например,

01 00000000000000000000000000000198699 XYZ

которые имеют значения int, отличные от 0, которые иногда необходимо заменить на

01 00000000000000000000000000000000000 XYZ

но из-за изменчивости значения int между маркерами 01 и XYZ прямой поиск и замена в текстовом редакторе не будут работать.

Часть, которой я должен манипулировать, имеет следующую структуру:

01  00000000000000000000000000000198699 XYZ

02  157

01  00000000000000000000000000000007749 XYZ

02  158

01  00000000000000000000000000000183279 XYZ

02  163

01  00000000000000000000000000000007749 XYZ

02  165

01  00000000000000000000000000000000000 XYZ

02  175

В идеале я хочу собрать пакетный файл, который ищет любые строки в файле .txt, начиная с маркера записи 01, и заменяет строку на:

01 00000000000000000000000000000000000 XYZ

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

Большинство примеров, которые я нашел, относились к замене одной строки другой, как в примере здесь

https://stackoverflow.com/questions/23075953/batch-script-to-find-and-replace-a-string-in-text-file-without-creating-an-extra/23076141?utm_medium=organic&utm_source=google_rich_qa&utm_campaign= google_rich_qa

а также

https://stackoverflow.com/questions/16614101/batch-script-find-string-in-text-file-by-line-then-replace-whole-line-with-anot?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

но не могу изменить, чтобы выполнить то, что мне нужно из командного файла.

Любой совет приветствуется.

2 ответа2

1

Это может быть то, что вы хотите

Пакетный файл справился с этим на удивление аккуратно!

Где a.a ваш файл данных

blahblah.bat - командный файл в одну строку

C:\Users\harvey>type blahblah.bat
@for /f "tokens=1,2 delims= " %%f in (a.a) do @IF "%%f"=="01" (echo 01 00000000000000000000000000000000000 XYZ) ELSE IF NOT "%%f"=="01" ECHO %%f %%g

C:\Users\harvey>

выполнить командный файл

C:\Users\harvey>blahblah
01 00000000000000000000000000000000000 XYZ
02 157
01 00000000000000000000000000000000000 XYZ
02 158
01 00000000000000000000000000000000000 XYZ
02 163
01 00000000000000000000000000000000000 XYZ
02 165
01 00000000000000000000000000000000000 XYZ
02 175

C:\Users\harvey>

Это, казалось, удаляло пустые строки, может быть способ обойти это с помощью пакета, но другой способ, кроме пакетного, - использовать sed.

C:\Users\harvey>sed -r "s/^01.*/01 00000000000000000000000000000000000 XYZ/" a.a

01 00000000000000000000000000000000000 XYZ

02  157

01 00000000000000000000000000000000000 XYZ

02  158

01 00000000000000000000000000000000000 XYZ

02  163

01 00000000000000000000000000000000000 XYZ

02  165

01 00000000000000000000000000000000000 XYZ

02  175

Конечно, вы можете добавить >b.b чтобы перенаправить этот вывод в новый файл, так что вы можете сделать sed -r "......." a.a > b.b т.е. sed -r "s/^01.*/01 00000000000000000000000000000000000 XYZ/" a.a > b.b

0

Один из способов проанализировать файл и сохранить пустые строки - дать нумерацию строк через findstr.
(поэтому они не пусты для цикла for /f)
и откажитесь от номера потом.

:: Q:\Test\2018\05\11\SU_1321271.cmd
@Echo off&SetLocal

Set "ZEROES=00000000000000000000000000000000000"

( for /f "tokens=1,2* delims=: " %%A in (
    'findstr /N "^" RawData.txt'
  ) do If "%%B"=="01" (
      echo=%%B  %ZEROES% XYZ
  ) else (
      echo=%%B  %%C
  )
) >NewData.txt

> type NewData.txt
01 00000000000000000000000000000000000 XYZ

02  157

01 00000000000000000000000000000000000 XYZ

02  158
...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .