Arquivo em lote para substituir a linha que contém um valor de sequência específico

0

Eu tenho um arquivo de interface, por exemplo, denominado RawData.txt, que contém diferentes regiões de dados, que podem variar de alguns milhares de linhas a mais de 100.000 linhas de dados.

Existe uma mistura de linhas que contêm, por exemplo

01 00000000000000000000000000000198699 XYZ

que possuem valores int diferentes de 0, incluindo que às vezes precisam ser substituídos por

01 00000000000000000000000000000000000 XYZ

mas devido à variabilidade do valor int entre os marcadores 01 e XYZ, um simples avanço e substituição em um editor de texto não funcionará.

A parte que eu preciso manipular é estruturada como abaixo:

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

Idealmente, estou procurando montar um arquivo de lote que procure por qualquer linha no arquivo .txt, começando com o marcador de registro 01 e substitua a linha por:

01 00000000000000000000000000000000000 XYZ

Eu assumo que a abordagem mais direta é encontrar qualquer linha que comece com 01 marcador de registro e substitua toda a linha, pois o comprimento precisa ser idêntico após as alterações serem feitas nos dados existentes. / p>

A maioria dos exemplos que encontrei está relacionada à substituição de uma string por outra, como no exemplo aqui

link

e

link

mas não pode modificar para realizar o que eu preciso de um arquivo de lote.

Qualquer conselho é apreciado.

    
por Grant SDC 09.05.2018 / 23:47

2 respostas

0

Isso pode ser o que você quer

Um arquivo em lote lidou com isso de forma surpreendentemente limpa!

Onde a.a é seu arquivo de dados

blahblah.bat é um arquivo em lote de uma linha

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>

execute o arquivo em lote

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>

Isso parece remover linhas em branco, pode haver uma maneira de contornar isso com lote, mas outra maneira, além de lote, é usar 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

Você pode, claro, adicionar >b.b para redirecionar essa saída para um novo arquivo, para poder fazer sed -r "......." a.a > b.b , ou seja, sed -r "s/^01.*/01 00000000000000000000000000000000000 XYZ/" a.a > b.b

    
por 10.05.2018 / 00:40
0

Uma maneira de analisar o arquivo e manter linhas vazias é deixar as linhas serem numeradas através do findstr
(assim eles não estão vazios para o loop for / f)
e descartar o número depois.

:: Q:\Test18\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
...
    
por 11.05.2018 / 02:09