Centrum Skryptów - Systemy Operacyjne

W jaki sposób odczytać tylko pojedynczy, określony 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.

W jaki sposób odczytać tylko pojedynczy, określony wiersz w pliku tekstowym?

Cześć Skrypciarze! W jaki sposób odczytać tylko określony wiersz w pliku tekstowym? Jak napisać skrypt, który przeczyta w pliku tekstowym na przykład tylko wiersz 16, a następnie przechowa wartość tego wiersza w zmiennej?

-- DL

Cześć DL. Od dłuższego czasu nie odpowiadaliśmy na pytania o pliki tekstowe, a nie ma z czego być dumnym; czasem wydaje się, że wszystkie pytania, które dostajemy, dotyczą zapisywania do lub odczytywania z plików tekstowych. Ludzie zawsze pytają, czy kiedykolwiek spotkaliśmy Billa Gatesa. Prawda jest taka, że zawsze próbujemy go unikać, bo boimy się, że zacznie zadawać nam pytania o pliki tekstowe.

Głównym powodem dla którego dostajemy tyle pytań o pliki tekstowe, jest to, że wbudowane w Windows technologie skryptowania nie są zbyt użyteczne w pracy z tekstem. Weźmy na przykład to pytanie. Można by się spodziewać, że WSH, VBScript, albo inny obiekt będzie wyposażony w metodę, która pozwoliłaby na przekazanie polecenia w rodzaju "Przeczytaj tylko i wyłącznie wiersz 16 w pliku". Niestety. FileSystemObject – który wyposażony jest w najwięcej możliwości, jeśli chodzi o pracę z tekstem – może jedynie zacząć od wiersza 1 w pliku i stopniowo schodzić niżej. Nie ma sposobu, żeby szybko przeskoczyć do określonego wiersza.

Nie znaczy to jednak, że nie można przechować wartości wiersza 16 w zmiennej; po prostu trzeba użyć do tego trochę mniej eleganckiego sposobu. Żeby było krótko i treściwie, zajmiemy się prostym plikiem tekstowym z pięcioma wierszami:

1

2

3

This is line no. 4 in the text file.

5

Chcemy przechować zawartość wiersza 4 – i tylko 4 – w zmiennej. Nie możemy przeskoczyć bezpośrednio do wiersza 4, ale możemy osiągnąć pożądany rezultat przy pomocy tego skryptu:

Const ForReading = 1



Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objTextFile = objFSO.OpenTextFile("mylogfile.log", ForReading)



For i = 1 to 3

    objTextFile.ReadLine

Next



strLine = objTextFile.ReadLine

Wscript.Echo strLine



objTextFile.Close

O co tu chodzi? Na początek tworzymy wystąpienie FileSystemObject i otwieramy do odczytu plik Mylogfile.log. Następnie tworzymy pętlę For Next (dla następnego), którą puszczamy między 1 a 3. Wewnątrz pętli przy pomocy metody ReadLine (przeczytaj wiersz) odczytujemy bieżący wiersz w pliku tekstowym.

Po co? Cóż, pamiętajcie, że interesuje nas tylko wiersz 4; FileSystemObject nie pozwoli nam niestety na przejście bezpośrednio do niego. Zamiast tego musimy najpierw przejść przez wiersze 1, 2 i 3. Tym właśnie zajmuje się ten blok kodu. Po pierwszym przejściu przez pętlę, wywołuje metodę ReadLine; odczytuje pierwszy wiersz w pliku tekstowym (nie robimy z nic przeczytanymi informacjami), a następnie automatycznie przechodzi do wiersza poniżej. Po drugim przejściu odczytujemy wiersz 2 i przechodzimy do 3. Po trzecim - odczytujemy wiersz 3 i przechodzimy do 4.

W tym momencie kończymy pracę z pętlą. Ponownie wywołujemy metodę ReadLine i zachowujemy zawartość wiersza w zmiennej strLine. Do tego służy poniższa linia kodu:

strLine = objTextFile.ReadLine

Następnie wywołujemy echo wartości strLine i zamykamy plik tekstowy. Nie mogliśmy tu użyć żadnych chytrych skrótów, ale osiągnęliśmy cel: zapisaliśmy wartość wiersza 4 w zmiennej strLine.

Jak mówiliśmy, niezbyt eleganckie, ale działa. Co więcej, działa całkiem szybko. Na przykład, utwórzcie przykładowy plik dziennika z 10 000 wierszy i zmodyfikujcie skrypt tak, żeby zachował w zmiennej tylko wartość wiersza 9999. (Jak? Przeróbcie pętlę For Next tak, aby działała w przedziale od 1 do 9998). Potem wywołajcie echo wartości wiersza 9999. Spróbujcie, a przekonacie się, że – pomijając kwestię elegancji – cały proces trwa około jednej sekundy. Skrypt, któremu działanie zajmuje tak niewiele czasu, podoba nam się szczególnie. W końcu małe jest piękne.

 Do początku strony Do początku strony


Centrum Skryptów - Systemy Operacyjne