Centrum skryptów - Systemy operacyjne

Jak zmodyfikować plik tekstowy, a następnie skopiować wybrane wiersze ze zmodyfikowanej zawartości?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak zmodyfikować plik tekstowy, a następnie skopiować wybrane wiersze ze zmodyfikowanej zawartości?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak stworzyć skrypt, który zmodyfikuje zawartość pliku tekstowego, a następnie przeniesie wybrane wiersze ze zmodyfikowanej zawartości do nowego pliku?

-- EH

Cześć Skrypciarze! Odpowiedź

Cześć EH. Tego się nie da zrobić. Następnie pytanie proszę.

No dobra, przepraszamy. Zobaczymy, co się da zrobić. Skrypciarz piszący te słowa jest dziś w podłym nastroju, jak zresztą każdego ranka, jednak teraz ma przynajmniej dobry powód. Otóż zawiodły wszelkie prognozy pogody i zamiast zapowiadanego słońca i wysokich, jak na tę porę roku, temperatur, jest pochmurno, pada i w ogóle nie da się pograć w piłkę. Nic więc dziwnego, że nasz Skrypciarz jest bardzo zawiedziony.

Wdech – wydech. Już dobrze. Przepraszamy za niemiłe wejście naszego Skrypciarza, który postanowił jednak odpowiedzieć na zadane pytanie. Tak więc:

Const ForReading = 1



Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForReading)



strContents = objFile.ReadAll

objFile.Close



strContents = Replace(strContents, "~", "~" & vbCrLf)



arrLines =Split(strContents, vbCrLf)



For Each strLine in arrLines

    If Left(strLine, 2) = "N9" or Left(strLine, 2) = "B4" Then

        strNewFile = strNewFile & strLine & vbCrLf

    End If

Next



Set objFile = objFSO.CreateTextFile("C:\Scripts\Test2.txt")

objFile.Write strNewFile

objFile.Close

Wyjaśnijmy teraz, na czym ten skrypt polega. Otóż zaczynamy od utworzenia stałej o nazwie ForReading, której nadajemy wartość 1; zastosujemy tę stałą do otwarcia naszego pliku tekstowego. Tak naprawdę, zastosujemy tę stałą w poniższym wierszu kodu, który stworzy wystąpienie obiektu Scripting.FileSystemObject, a następnie za pomocą metody OpenTextFile otworzy plik C:\Scripts\Test.txt:

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForReading)

Żeby nie było tak prosto, plik tekstowy przesłany przez EH zawiera wszystkie znaki w jednym wierszu. Wygląda on następująco:

*070219*1347*U*00401*000000852*0*P*>~GS*QO*CMACGM*USALTLANP*20070219*1347*85

2*X*004010~ST*315*0001~B4***CT*20070219*0840*1703*CAXU*983290*L*4510~N9*BM*SZ2

711711~N9*BN*SHZ438713~N9*SN*C4025491~Q2*9227027*****166***PX311E***L*CSCL

DALIAN~R4*L*K*57078*YANTIAN~DTM*140*20070119*1200~R4*D*D*1703*SAVANNAH, GA~

Chcemy teraz dokonać odczytu z pliku i zrobić dwie rzeczy. Po pierwsze, wstawić znak powrotu karetki po każdym znaku tyldy (~), dzięki czemu otrzymamy wiersze wyglądające w ten oto sposób:

*070219*1347*U*00401*000000852*0*P*>~

GS*QO*CMACGM*USALTLANP*20070219*1347*852*X*004010~

ST*315*0001~

B4***CT*20070219*0840*1703*CAXU*983290*L*4510~

N9*BM*SZ2711711~

N9*BN*SHZ438713~

N9*SN*C4025491~

Q2*9227027*****166***PX311E***L*CSCL DALIAN~

R4*L*K*57078*YANTIAN~

DTM*140*20070119*1200~

R4*D*D*1703*SAVANNAH, GA~

Następnie chcemy zidentyfikować wszystkie wiersze, które zaczynają się od N9 lub B4 i skopiować je do oddzielnego pliku. Dziwnie to brzmi, wiem, ale przecież o to nam właśnie chodzi.

Zaczynamy od zastosowania metody ReadAll, aby wczytać cały plik do pamięci i zachować jego zawartość w zmiennej o nazwie strContents:

strContents = objFile.ReadAll

Zaraz potem zamykamy plik C:\Scripts\Test.txt. Dlaczego? Ponieważ już nie będzie nam potrzebny, będziemy teraz pracować ze zmienną strContents.

Wszystko po kolei. Najpierw umieszczamy znak powrotu karetki po każdym znaku tyldy w pliku. W jaki sposób? Właśnie taki:

strContents = Replace(strContents, "~", "~" & vbCrLf)

Jak widać, używamy funkcji Replace w celu zastąpienia każdego znaku tyldy dwoma znakami: tyldą oraz znakiem powrotu karetki (jak przewiduje stała skryptu VBScript – vbCrLf). Efekt: znaki tyldy pozostały dokładnie w tym samym miejscu, a po każdym mamy teraz znak powrotu karetki.

Oczywiście to nie wszystko: nasz plik tekstowy (lub przynajmniej jego wirtualna kopia) dzięki dodaniu znaków powrotu karetki składa się teraz z wielu osobnych wierszy. A skoro składa się teraz z wielu wierszy, możemy skopiować te z nich, które zaczynają się od N9 lub B4.

W tym celu najpierw stosujemy funkcję Split i rozdzielamy zmienną strContents, używając znaku powrotu karetki jako delimitera:

arrLines =Split(strContents, vbCrLf)

W wyniku tego otrzymujemy tablicę (arrLines), w której każdy element reprezentuje wiersz w pliku tekstowym. To z kolei oznacza, że możemy teraz „odczytać” każdy wiersz pliku, uruchamiając pętlę For Each, która przejdzie przez wszystkie elementy znajdujące się w tablicy:

For Each strLine in arrLines

Wewnątrz pętli, w przypadku każdego elementu sprawdzimy, czy jego pierwsze dwa znaki to N9 lub B4; posłuży nam do tego poniższy wiersz kodu oraz funkcja Left:

If Left(strLine, 2) = "N9" or Left(strLine, 2) = "B4" Then

Przypuśćmy, że znaleźliśmy jeden z naszych docelowych wierszy. W takim wypadku, dodajemy jego wartość (wraz ze znakiem powrotu karetki) do zmiennej o nazwie strNewFile:

strNewFile = strNewFile & strLine & vbCrLf

Potem pętla kontynuuje działanie, powtarzając ten proces dla następnego elementu z tablicy.

Po zakończeniu działania pętli w tablicy, stosujemy następujący wiersz kodu:

Set objFile = objFSO.CreateTextFile("C:\Scripts\Test2.txt")

objFile.Write strNewFile

objFile.Close

Teraz za pomocą metody CreateTextFile tworzymy nowy plik o nazwie C:\Scripts\Test2.txt. Następnie, stosując metodę Write, wpisujemy wartość zmiennej strNewFile do pliku Test2.txt, zamykamy go i… na tym koniec. Jeżeli otworzymy teraz plik Test2.txt, powinien on wyglądać następująco:

B4***CT*20070219*0840*1703*CAXU*983290*L*4510~

N9*BM*SZ2711711~

N9*BN*SHZ438713~

N9*SN*C4025491~

Czyż nie o to nam właśnie chodziło?

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne