Centrum skryptów - Systemy operacyjne

Jak odwrócić wszystkie wiersze 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 odwrócić wszystkie wiersze w pliku tekstowym?

Cześć Skrypciarze! Pytanie

Cześć Skrypciarze! Jak „obrócić” plik tekstowy o 180 stopni? Chcę, żeby ostatni wiersz stał się pierwszym wierszem, a pierwszy wiersz ostatnim, przy czym wszystkie pozostałe wiersze także powinny zmienić miejsca.

-- BJM

Cześć Skrypciarze! Odpowiedź

Cześć, BJM. Wiecie sami o tym, że kiedy większość ludzi myśli o Skrypciarzach, nasuwają im się takie myśli, jak: „Ci Skrypciarze są absolutnymi geniuszami, jeżeli chodzi o skrypty administrowania systemem. Ale to znaczy też, że nie mają pojęcia o czymkolwiek poza tymi skryptami, jak na przykład o prowadzeniu zabawnych konwersacji na cocktail-party, sytuacji politycznej w Azji Południowo-Wschodniej czy współczesnym teatrze. Nie są wszechstronnie wykształconymi intelektualistami.” Chcecie znać prawdę? Otóż brzmi ona: i tak, i nie. Otóż być może o skryptach administracyjnych wiemy trochę więcej, niż o całej reszcie, ale wiedzę tę czerpiemy wyłącznie z codziennych artykułów „Cześć, Skrypciarze”. Nie dysponujemy tak znakomitym źródłem w przypadku żadnej innej dziedziny, ale to oczywiście nie przeszkadza nam wyrażać się autorytatywnie o skryptach i całym świecie. W najgorszym razie okazuje się, że to świat, o którym mówimy, jest wywrócony do góry nogami.

Być może dlatego z taką łatwością przyszło mi napisanie skryptu, który odwraca wszystkie wiersze w pliku tekstowym. Efekt jest taki sam – wszystko do góry nogami.

Oto nasz skrypt:

Const ForReading = 1

Const ForWriting = 2



Dim arrLines()

i = 0



Set objFSO = CreateObject("Scripting.FileSystemObject")

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



Do Until objFile.AtEndOfStream

    Redim Preserve arrLines(i)

    arrLines(i) = objFile.ReadLine

    i = i + 1

Loop



objFile.Close



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



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

    objFile.WriteLine arrLines(i)

Next



objFile.Close

Jak widzimy, rozpoczynamy od zdefiniowania pary stałych (ForReading oraz ForWriting). Stałe te zostaną przez nas wykorzystane podczas otwierania pliku, który ma zostać „odwrócony”. Po ich zdefiniowaniu używamy następującego wiersza kodu w celu utworzenia dynamicznej tablicy o nazwie arrLines:

Dim arrLines()

Kiedy utworzymy tablicę, ustawiamy wartość zmiennej licznika i na 0.

Uwaga. A cóż to? Co to jest „dynamiczna tablica”? No cóż, w skryptach VBScript, nasza stara tablica to tablica o ustalonym rozmiarze; z góry należy określić, że ta tablica będzie zawierała najwyżej 10, 12, 15 czy ileś tam elementów. Natomiast dynamiczna tablica jest, cóż, bardziej dynamiczna: może przybrać dowolny rozmiar, który może być dowolnie zmieniany tak, aby pomieścić nowe elementy. Potrzebujemy tutaj dynamicznej tablicy z jednego prostego powodu: wykorzystamy ją do przechowania wszystkich wierszy, które wczytamy z pliku tekstowego, a ponieważ nie mamy zielonego pojęcia ile wierszy znajduje się w pliku tekstowym, nie możemy określić rozmiaru tablicy w wyprzedzeniem. To sprawia, że mamy tylko jedną opcję: tablicę dynamiczną.

Naszym następnym krokiem jest utworzenie wystąpienia obiektu Scripting.FileSystemObject i zastosowanie metody OpenTextFile w celu otwarcia pliku C:\Scripts\Test.txt do odczytu, w czym pomocne są nam poniższe dwa wiersze kodu:

Set objFSO = CreateObject("Scripting.FileSystemObject")

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

To z kolei sprowadza nas do następującego fragmentu kodu:

Do Until objFile.AtEndOfStream

    Redim Preserve arrLines(i)

    arrLines(i) = objFile.ReadLine

    i = i + 1

Loop

Uruchamiamy tutaj pętlę Do Until która będzie działać, dopóki nie wczytamy całego pliku tekstowego (czyli dopóki właściwość AtEndOfStream pliku nie uzyska wartości True). Wewnątrz tej pętli pierwszą naszą czynnością jest wykonanie poniższego wiersza kodu:

Redim Preserve arrLines(i)

Jak się okazuje, isntrukcja Redim Preserve jest kluczem do zmiany rozmiaru naszej dynamicznej tablicy. Instrukcja Redim zostaje wykorzystana do zmiany rozmiaru tablicy, podczas gdy instrukcja Preserve mówi skryptowi, że ma bez wahania zachować wszelkie istniejące dane znajdujące się w tablicy. To, nawiasem mówiąc, jest bardzo ważne. Załóżmy, że opuszczamy zdanie Preserve i zamiast tego stosujemy poniższy wiersz kodu:

Redim arrLines(i)

Co mogłoby się stać ? No cóż, w takim przypadku rozmiar naszej tablicy zostałby zmieniony. Jednakże przy okazji wszystkie znajdujące się w niej elementy zostałyby usunięte.

Co nam przypomina: zauważmy, że używamy zmiennej licznika i w celu wskazania rozmiaru tablicy. Ponieważ w chwili obecnej zmienna licznika i ma wartość 0, oznacza to, że po pierwszym przejściu pętli otrzymamy tabelę o nazwie arrLines, która będzie miała rozmiar równy 0. (Co z kolei oznacza, że tablica będzie zawierać jeden element: tablica zawsze zawiera o jeden element więcej, niż wskazywałby na to jej rozmiar. Jest tak dlatego, że pierwszy element w tablicy zawsze jest oznaczony numerem indeksu 0.)

Co się zatem dzieje, kiedy już mamy tablicę w rozmiarze 0? Cóż, następnym krokiem jest wywołanie metody ReadLine w celu odczytania pierwszego wiersza z pliku, a następnie przypisujemy tę wartość do elementu 0 w tablicy. Robimy to w ten oto sposób:

arrLines(i) = objFile.ReadLine

Następnie zwiększamy wartość o 1. Oznacza to, że po drugim przejściu pętli zmienna licznika będzie miała wartość 1. To z kolei oznacza, że zwiększamy rozmiar tablicy do 1 (czyli będzie ona teraz zawierać 2 elementy), a następnie odczytujemy następny wiersz w pliku tekstowym i przypisujemy tę wartość do drugiego elementu w tablicy (elementu o numerze indeksu 1). Ten proces trwa, dopóki nie odczytamy i nie przetworzymy każdego z osobna wiersza w pliku tekstowym, w którym to momencie automatycznie zakończymy działanie pętli Do Until. Zaraz potem stosujemy metodę Close w celu zamknięcia pliku C:\Scripts\Test.txt.

Zatem co to wszystko oznacza? To oznacza, że tablica arrLines zawiera teraz poszczególne wiersze pliku tekstowego, które według naszego założenia wyglądają tak:

E. This is line 5.

D. This is line 4.

C. This is line 3.

B. This is line 2.

A. This is line 1.

Innymi słowy, tablica arrLines jest teraz wierną kopią pliku tekstowego C:\Scripts\Test.txt.

Teraz jesteśmy gotowi odwrócić ten plik tekstowy. Jak się okazuje, skrypt VBScript nie zawiera żadnej funkcji o działaniu odwracającym; jednak VBScript zawiera procedurę odczytującą tablicę od dołu do góry. To właśnie podejście zastosujemy w celu odwrócenia kolejności wierszy w pliku tekstowym.

W tym celu otwieramy ponownie plik C:\Scripts\Test.txt, tym razem do odczytu:

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

Kiedy tylko otworzy się on ponownie, uruchamiamy poniższy fragment kodu:

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

    objFile.WriteLine arrLines(i)

Next

Odczytujemy tutaj tę tablicę od dołu do góry: zaczynamy od elementu Ubound (ostatniego elementu w tablicy)i kończymy na elemencie Lbound (pierwszym elemencie w tablicy). Innymi słowy, pętla For Next rozpoczyna od elementu 4 (pamiętajmy, że w tablicy pięcioelementowej, czyli takiej, jak nasza, ostatni element ma numer indeksu 4) i kończy na elemencie 0 (ponieważ pierwszy element w tablicy zawsze ma numer indeksu 0). Następnie stosujemy instrukcję Step -1 aby upewnić się, że nasza pętla będzie działać wstecz: element 4, element 3, element 2, element 1, element 0.

Wewnątrz tej pętli stosujemy po prostu metodę WriteLine w celu wpisania wartości bieżącego elementu tablicy (przy pierwszym przejściu pętli elementu 4) do pliku tekstowego. Ten proces trwa dopóki nie dotrzemy do każdego elementu w tablicy, wtedy kończymy działanie pętli, zamykamy plik i zajmujemy czymś bardziej ekscytującym.

Takim, jak oglądanie powtórki meczu naszej reprezentacji.

Zatem jaki jest ostateczny efekt naszych działań? Oto on:

A. This is line 1.

B. This is line 2.

C. This is line 3.

D. This is line 4.

E. This is line 5.

Jak widzimy, udało nam się odwrócić nasz plik tekstowy: pierwszy wiersz jest teraz ostatnim, ostatni jest pierwszym, a wszystko, co pomiędzy nimi, również zmieniło miejsca. A to przecież dokładnie to, o co nam chodziło.

I to by było na tyle, BJM. Tak się składa, że wiem, że masz jeszcze jedno pytanie dotyczące plików tekstowych. Ale nie martw się, zajmę się tym w przyszłości.

W końcu jeżeli chodzi o skryptowanie to jestem geniuszem.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne