Belirli bir dize değeri içeren satırı değiştirmek için toplu iş dosyası


0

Örneğin, birkaç bin satırdan 100.000 satıra yakın veri aralığına kadar değişen farklı veri bölgeleri içeren RawData.txt adlı bir arabirim dosyasına sahibim.

Örneğin içeren bir çizgi karışımı var

01 0000000000000000000000000000000198699 XYZ

0'dan farklı int değerlerine sahip olan ve zaman zaman değiştirilmesi gerekenler

01 0000000000000000000000000000000000000 XYZ

ancak int değerinin 01 ve XYZ imleyicileri arasındaki değişkenliği nedeniyle, bir metin editöründe yalındır ve bulmacanın çalışmaz.

Yönlendirmem gereken kısım aşağıdaki gibi yapılandırılmıştır:

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

İdeal olarak, 01 kayıt işaretçisi ile başlayan .txt dosyasındaki tüm satırları arayan ve satırın yerini alan bir toplu iş dosyası oluşturmaya çalışıyorum:

01 0000000000000000000000000000000000000 XYZ

En ileri yaklaşımın, ile başlayan satırları bulmak olduğunu farz ediyorum. 01 işaretleyiciyi kaydedin ve tüm verileri değiştirin çünkü uzunluk mevcut verilerde değişiklik yapıldıktan sonra aynı olmalıdır.

Örneklerden biri, buradaki örnekte olduğu gibi bir dize diğeriyle değiştirmekle ilgili buldum

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 & Sons, utm_campaign = google_rich_qa

ve

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

ancak toplu iş dosyasından ihtiyacım olanı gerçekleştirmek için değişiklik yapamıyorum.

Herhangi bir tavsiye takdir edilmektedir.


Örnekleriniz, aralarında bir ve iki boşluk 01 ve 000... alanlar. Hangisi doğru? Her ikisi de olabilir mi? Yeni dizge aynı sayıda boşluk gerektiriyor mu?
AFH

1
Düzenli ifadeleri destekledikleri için metin editörlerinin ne kadar çok yönlü olduklarına şaşıracaksınız. Yani, notepad ++ gibi bir metin düzenleyicide bir regex onay kutusunu işaretlemeyi ve işlemi yapmayı deneyin [0-9]* ve göreceksiniz ki bu rakam dizisiyle uyuşacak. Ancak bir toplu iş dosyası veya herhangi bir dil de istediğinizi yapabilir.
barlop

Özür dilerim, örnek veriler benim açımdan kötü biçimleniyor. 01 ve büyük tamsayı dizgisi arasında 2 boşluk ve tamsayı dizgisi ile XYS işaretleyicisi arasında bir boşluk olması gerekir.
Grant SDC

@GrantSDC tamam nasıl @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
barlop

1
Ayrıca sadece çizgi gibi bir dosya gibi basit bir örnek test abc[multiple spaces]def ve abc'yi ilk belirteç olarak kabul eder ve ikinciyi def olarak tanımlar. Bu yüzden sınırlayıcı olarak bir boşluk veya bitişik boşlukların bir dizisini sayar. Daha iyi anlamak istiyorsanız, basit örnekler kullanmaya değer.
barlop

Yanıtlar:


1

İstediğin bu olabilir

Bir toplu iş dosyası bu şaşırtıcı derecede düzgünce ele!

Nerede a.a veri dosyanız

blahblah.bat bir satır toplu iş dosyasıdır

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>

toplu iş dosyasını yürütün

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>

Boş satırları kaldırmış gibi görünüyordu, toplu işlemle bunun çevresinde bir yol olabilir, ancak toplu işlem dışında başka bir yöntem de sed kullanmaktır.

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

Elbette ekleyebilirsin >b.b Çıktıyı yeni bir dosyaya yönlendirmek için sed -r "......." a.a > b.b diğer bir deyişle sed -r "s/^01.*/01 00000000000000000000000000000000000 XYZ/" a.a > b.b


Bu barlop için teşekkürler. Tam dosyaya uyarlama konusunda biraz sorun yaşıyorsanız, ancak bu bana başlamak için iyi bir yer verdi.
Grant SDC

Unutmam gerekir ki, uzun ömürlü olmak için, bu sed çizgileri perl'e uyarlamakta fayda var. stackoverflow.com/questions/4794145/perl-one-liner-like-grep görmek superuser.com/questions/416419/... Sed'in bazen sorunları olabilir ve perl daha esnektir.
barlop

0

Dosyayı ayrıştırmanın ve boş satırları tutmanın bir yolu, satırların findstr aracılığıyla numaralandırılmasını sağlamaktır.
(yani for / f döngüsü için boş değiller)
ve numarayı sonradan atın.

:: 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
...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.