Plik wsadowy do zastąpienia wiersza zawierającego określoną wartość ciągu

0

Mam plik interfejsu na przykład o nazwie RawData.txt, który zawiera różne regiony danych, które mogą zawierać się w przedziale od kilku tysięcy linii do bliższych 100 000 linii danych.

Istnieje mieszanka linii, które zawierają na przykład

01 00000000000000000000000000000198699 XYZ

które zawierają wartości int inne niż 0, które czasami trzeba zastąpić

01 00000000000000000000000000000000000 XYZ

ale ze względu na zmienność wartości int między znacznikami 01 i XYZ proste wyszukiwanie i zamiana w edytorze tekstu nie będzie działać.

Część, którą muszę manipulować, ma następującą strukturę:

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

Idealnie chcę połączyć plik wsadowy, który wyszukuje dowolne wiersze w pliku .txt, zaczynając od znacznika rekordu 01 i zastępuje wiersz:

01 00000000000000000000000000000000000 XYZ

Zakładam, że najprostszym podejściem jest znalezienie dowolnej linii rozpoczynającej się od znacznika rekordu 01 i zastąpienie całej linii, ponieważ długość musi być identyczna po wprowadzeniu poprawek do istniejących danych.

Większość przykładów, które znalazłem, dotyczyło zamiany jednego łańcucha na inny, jak w przykładzie tutaj

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

i

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

ale nie można go modyfikować, aby osiągnąć to, czego potrzebuję z pliku wsadowego.

Wszelkie porady są mile widziane.

Udziel SDC
źródło
Twoje przykłady pokazują mieszankę jednego i dwóch przestrzeniach pomiędzy 01i na 000...polach. Który jest poprawny? Czy może wystąpić jedno? Czy ciąg zastępujący wymaga takiej samej liczby spacji?
AFH,
1
Och, byłbyś zaskoczony, jak wszechstronne są edytory tekstu, ponieważ obsługują wyrażenia regularne. Tak więc w edytorze tekstów, takim jak Notatnik ++, spróbuj zaznaczyć pole wyboru wyrażenia regularnego i zrobić, [0-9]*a zobaczysz, że będzie pasował do tego ciągu cyfr. Ale plik wsadowy lub dowolny język powinien być w stanie robić to, co chcesz.
barlop
Przepraszam, że przykładowe dane są źle sformatowane z mojej strony. Pomiędzy 01 a dużym ciągiem liczb całkowitych muszą znajdować się 2 spacje oraz jedna spacja między ciągiem liczb całkowitych a znacznikiem XYS.
Grant SDC
@GrantSDC ok, co @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
powiesz na
1
Przetestowałem również prosty przykład, taki jak plik z samą linią, abc[multiple spaces]defi traktuje abc jako pierwszy token, a def jako drugi. Tak więc liczy on spację lub sekwencję ciągłych spacji, aby być ogranicznikiem. Warto użyć prostych przykładów, jeśli chcesz to lepiej zrozumieć.
barlop

Odpowiedzi:

1

To może być to, czego chcesz

Plik wsadowy poradził sobie z tym zaskakująco starannie!

Gdzie a.ajest twój plik danych?

blahblah.bat to jednowierszowy plik wsadowy

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>

uruchom plik wsadowy

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>

To zdawało się usuwać puste linie, może być obejście tego za pomocą wsadu, ale innym sposobem, oprócz wsadu, jest użycie 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

Możesz oczywiście dodać, >b.baby przekierować to wyjście do nowego pliku, więc możesz to zrobić sed -r "......." a.a > b.b npsed -r "s/^01.*/01 00000000000000000000000000000000000 XYZ/" a.a > b.b

barlop
źródło
Dzięki za ten barlop. Mam problem z dostosowaniem się do pełnego pliku, ale dało mi to dobry początek.
Grant SDC
Powinienem zauważyć, że dla długowieczności warto dostosować te linie sed do perla. stackoverflow.com/questions/4794145/perl-one-liner-like-grep patrz superuser.com/questions/416419/… Sed może czasem mieć problemy, a perl jest bardziej elastyczny.
barlop
0

Jednym ze sposobów na przeanalizowanie pliku i zachowanie pustych linii jest umożliwienie numerowania linii przez findstr
(aby nie były puste dla pętli for / f),
a następnie odrzucenie numeru.

:: 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
...
LotPings
źródło