Centrum skryptów - Systemy operacyjne

Jak usunąć pierwszy i ostatni wiersz w pliku tekstowym?

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 usunąć pierwszy i ostatni wiersz w pliku tekstowym?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak usunąć pierwszy i ostatni wiersz w pliku tekstowym?

-- TF

Cześć Skrypciarze! Odpowiedź

Cześć, Skrypciarze! Nie wiem, czy ktoś to już wcześniej zauważył, ale w rubryce Cześć Skrypciarze utrzymuje się tendencja do, jak to niektórzy mówią, ględzenia. Podobno są takie dni, kiedy jakoś nie możemy tak po prostu przejść do sedna sprawy i odpowiedzieć na zadane pytanie; zamiast tego dygresja goni dygresję i pełno jest gadania, bez którego moglibyśmy się obyć. Jest to oczywiście opinia tych, którzy zazdroszczą Skrypciarzom zdolności literackich i wodą na ich młyn byłyby opinie typu: jaka ta rubryka jest nudna, nic tylko skryptowanie, żadnego poczucia humoru itd. Na szczęście jednak mamy tę świadomość, że większość zainteresowanych po prostu uwielbia nasze „ględzenie”, gdyż wprowadza ono element urozmaicenia do ich codziennego życia, a niektórzy nawet czekają na kolejny artykuł jak na odcinek swojego ulubionego serialu.

No tak, po tej obowiązkowej porcji wynurzeń możemy już przedstawić skrypt, za pomocą którego można usunąć pierwszy i ostatni wiersz z pliku tekstowego:

Const ForReading = 1

Const ForWriting = 2



Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objTextFile = objFSO.OpenTextFile("c:\Scripts\Test.txt", ForReading)



strText = objTextFile.ReadAll

objTextFile.Close



arrLines = Split(strText, vbCrLf)



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



For i = 1 to (Ubound(arrLines) - 1)

    objFile.WriteLine arrLines(i)

Next



objFile.Close

OK, zobaczmy, jak to działa. Zaczynamy od określenia dwóch stałych, ForReading oraz ForWriting; będziemy je wykorzystywać przy każdym otwieraniu pliku tekstowego. Zanim ktoś zdąży zapytać: tak, będziemy musieli otworzyć plik tekstowy dwa razy. Z uwagi na fakt, że nie można bezpośrednio edytować pliku tekstowego za pomocą skryptu, musimy najpierw otworzyć ten plik w celu odczytania zawartości. Odczytujemy plik, zachowujemy zawartość w pamięci, a następnie „usuwamy” pierwszy i ostatni wiersz z tej wirtualnej kopii pliku. Potem otwieramy plik tekstowy po raz drugi (tym razem w celu dokonania wpisu) i zastępujemy oryginalną zawartość wirtualną kopią.

Mając to na uwadze, naszym następnym posunięciem będzie utworzenie wystąpienia obiektu Scripting.FileSystemObject, a następnie otwarcie pliku tekstowego C:\Scripts\Test.txt do odczytu:

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objTextFile = objFSO.OpenTextFile("c:\Scripts\Test.txt", ForReading)

W tym momencie używamy metody ReadAll w celu odczytania zawartości pliku i zachowania zawartości w zmiennej o nazwie strText. Kiedy już dokonamy odczytu, wywołujemy metodę Close i zamykamy plik tekstowy.

Załóżmy, że ten plik tekstowy (a zarazem wartość zmiennej strText) wygląda następująco:

This is line 1.

This is line 2.

This is line 3.

This is line 4.

This is line 5.

Naszym zadaniem jest teraz usunięcie pierwszego i ostatniego wiersza. Jak tego dokonamy? No cóż, dla niewtajemniczonych, zastosujemy funkcję Split i zamienimy nasz wirtualny tekst na tablicę:

arrLines = Split(strText, vbCrLf)

Jak widzimy, rozdzielamy plik używając znaku powrotu karetki jako delimitera (vbCrLf); dzięki temu otrzymamy tablicę, w której każdy element odpowiada wierszowi pliku tekstowego. To z kolei sprawia, że pierwszy element w tablicy to:

This is line 1.

Natomiast ostatni element w tablicy to:

This is line 5.

Możecie wierzyć lub nie, ale teraz jesteśmy gotowi do wpisania zmodyfikowanej zawartości z powrotem do pliku. Że co? Jeszcze nie usunęliśmy pierwszego i ostatniego wiersza? To fakt, ale prawdę mówiąc wcale nie mamy zamiaru tego robić (z tego powodu powiedzieliśmy, że „usuniemy” te wiersze). Ale nie ma się czym martwić, ani pierwszy, ani ostatni wiersz nie pojawi się w pliku. Macie to jak w banku.

Jakież to ekscytujące: Jak piszący te słowa Skrypciarz wydostanie się z pułapki, którą sam na siebie zastawił? No cóż, na początek otwieramy ponownie plik tekstowy C:\Scripts\Test.txt. Jednak tym razem otwieramy go w celu dokonania wpisu:

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

A co wpiszemy do tego pliku? Wpiszemy do niego tę zawartość, którą odczytaliśmy z pliku tekstowego – poza, oczywiście, pierwszym i ostatnim wierszem. Do tego potrzebny jest nam następujący fragment kodu:

For i = 1 to (Ubound(arrLines) - 1)

    objFile.WriteLine arrLines(i)

Next

Uruchamiamy teraz pętlę For Next, która przejdzie przez elementy tablicy arrLines. Zaraz, wróć: przez większość elementów tablicy arrLines. Jak wiemy, pierwszy element w tablicy zawsze ma numer indeksu 0; oznacza to, że drugi element w tablicy ma numer indeksu 1. Zauważmy, gdzie zaczyna pracę nasza pętla For Next: od numeru 1, czyli drugiego elementu w tablicy. Innymi słowy opuszczamy element 1 (i w ten sposób wiersz 1). Wiemy także, że funkcja Ubound identyfikuje ostatni element tablicy. No dobra, spójrzmy na koniec naszej pętli For Next: Ubound(arrLines) – 1. Jasne? Ostatni element w naszej pętli to górny zakres naszej tablicy (Ubound) minus 1. Ujmując to inaczej, przedostatni element tablicy. To oznacza, że opuszczamy ostatni element w tablicy, a więc tym samym ostatni wiersz w pliku tekstowym.

To tyle, jeżeli chodzi o polecenie For Next. Wewnątrz pętli stosujemy metodę WriteLine w celu wpisania każdego elementu z tablicy (poza oczywiście pierwszym i ostatnim) z powrotem do pliku C:\Scripts\Test.txt. Co to oznacza? Oznacza to koniec naszej pracy, plik Test.txt będzie wyglądał następująco:

This is line 2.

This is line 3.

This is line 4.

Jest to nasz pierwotny plik, ale bez pierwszego i ostatniego wiersza. Całkiem proste, nieprawdaż?

Jak wiecie, zazwyczaj staramy się zabłysnąć jakąś puentą na końcu artykułu. Skoro jednak powstrzymaliśmy się od wszelkich początkowych dygresji, nie mamy powodu, ani punktu zaczepienia, żeby umieszczać teraz na końcu puentę. A szkoda.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne