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
i
ale nie można go modyfikować, aby osiągnąć to, czego potrzebuję z pliku wsadowego.
Wszelkie porady są mile widziane.
źródło
01
i na000...
polach. Który jest poprawny? Czy może wystąpić jedno? Czy ciąg zastępujący wymaga takiej samej liczby spacji?[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.@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
abc[multiple spaces]def
i 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ć.Odpowiedzi:
To może być to, czego chcesz
Plik wsadowy poradził sobie z tym zaskakująco starannie!
Gdzie
a.a
jest twój plik danych?blahblah.bat to jednowierszowy plik wsadowy
uruchom plik wsadowy
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.
Możesz oczywiście dodać,
>b.b
aby 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
źródło
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.
źródło