Centrum skryptów - Systemy operacyjne

Jak łączyć 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 łączyć wiersze w pliku tekstowym?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak łączyć wiersze w pliku tekstowym?

-- JN

Cześć Skrypciarze! Odpowiedź

Cześć, JN. A zatem chcesz wiedzieć, jak łączyć wiersze w pliku tekstowym, hę? No cóż, prawdę mówiąc trochę się dzisiaj spieszę, właśnie miałem zamiar zwiedzać Katedrę Świętego Piotra oraz Kaplicę Sykstyńską. Chociaż prawdę mówiąc mam jeszcze kilka minut, więc zobaczmy, co się da zrobić.

Uwaga. Uprzedzając wszelkie pytania: tak, to czysty zbieg okoliczności, że jestem na wakacjach w Watykanie, właśnie na kilka dni przed spotkaniem podsumowującym moją całoroczną pracę. Wcale nie jestem tutaj po to, żeby sobie wymodlić pozytywny wynik tego podsumowania. Przecież to jasne, że jeżeli wynik tego podsumowania wypadnie choć odrobinę podobnie do tego z poprzedniego roku to – chyba nawet nie musze tego wypowiadać na głos – nawet boska interwencja zbyt wiele nie pomoże.

No dobra, zobaczmy zatem, o co chodzi. Połączyć dwa wiersze w pliku tekstowym…. Mam pewien pomysł.

Jedną z wspaniałych zalet podróży jest to, że możemy poznać mało znane fakty z życia znanych osób. Weźmy takiego Michała Anioła. Większość ludzi zna go jako architekta Katedry Św. Piotra, rzeźbiarza Piety lub malarza Kaplicy Sykstyńskiej. Większość ludzi nie wie jednak, Michał Anioł, zanim został artystą, był pomocnikiem Skrypciarzy. Nieźle, nie? Jeszcze lepsze jest to, że jeden ze skryptów, które napisał w tym czasie, pozwala łączyć wiersze w pliku tekstowym. Skopiowawszy manuskrypt z biblioteki watykańskiej, mogę teraz przedstawić napisany przez Michała Anioła skrypt łączący wiersze w pliku tekstowym:

Const ForReading = 1

Const ForWriting = 2



Set objFSO = CreateObject("Scripting.FileSystemObject")

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



Do Until objFile.AtEndOfStream

    strLine1 = objFile.ReadLine

    strLine2 = objFile.ReadLine

    strNewLine = strLine1 & strLine2

    strNewContents = strNewContents & strNewLine & vbCrLf

Loop



objFile.Close



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

objFile.Write strNewContents

objFile.Close

A niektórzy ludzie uważają, że to sklepienie w Kaplicy Sykstyńskiej jest najlepszym dziełem tego artysty. Ha! Ja osobiście nie mogłem pohamować łez wzruszenia, kiedy po raz pierwszy go zobaczyłem. Arcydzieło, po prostu arcydzieło.

Zanim wyjaśnię, jak on działa, przedstawmy bliżej naszą sytuację. Mamy plik tekstowy wyglądający następująco:

SID123456

789

SID234567

891

SID345678

912

SID456789

123

Tak, to bardzo ładny plik tekstowy. Niestety, pewne rzeczy zostały pomieszane, ostatnie trzy znaki w każdym wierszu zostały umieszczone w oddzielnym wierszu. W rzeczywistości plik powinien wyglądać tak:

SID123456789

SID234567891

SID345678912

SID456789123

W tym przykładzie oznacza to cztery wiersze, a nie osiem.

Halo, skąd ten smutny wyraz twarzy? Słuchajcie, nie ma co rozpaczać: nie tylko jesteśmy w stanie naprawić ten plik tekstowy, ale także, jak zaraz sami zobaczycie, zrobimy to bardzo małym nakładem pracy.

Jak więc naprawimy ten plik? No cóż, Michał Anioł rozwiązał ten problem, definiując na początku dwie stałe: ForReading oraz ForWriting; jak większość naszych czytelników wie, zostaną one użyte podczas otwierania pliku tekstowego. Ponadto, większość z Was wie już także, że będziemy musieli otworzyć plik dwa razy: raz w celu wczytania istniejących stałych, a drugi raz w celu wypisania zmienionej zawartości.) Po zdefiniowaniu tych dwóch stałych tworzymy wystąpienie obiektu Scripting.FileSystemObject, a następnie stosujemy poniższy wiersz kodu w celu otwarcia pliku C:\Scripts\Test.txt do odczytu:

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

Nasze następne zadanie to odczytanie bieżącej zawartości pliku, wiersz po wierszu. W tym celu najpierw uruchamiamy pętlę Do Until, która będzie działać, dopóki nie dojdziemy do końca pliku (czyli dopóki właściwość AtEndOfStream pliku nie uzyska wartości True). Wewnątrz tej pętli wywołujemy metodę ReadLine w celu odczytania pierwszego wiersza z pliku i zachowania go w zmiennej o nazwie strLine1:

strLine2 = objFile.ReadLine

Jaki jest cel tego wszystkiego? Cóż, strLine1 ma teraz wartość SID123456, a strLine2 ma wartość 789. Zgadnijcie, co się stanie, kiedy połączymy te dwie wartości? Właśnie:

SID123456789

To rzecz jasna jest właśnie wartość, o którą nam chodziło. Mając to na uwadze, stosujemy poniższy wiersz kodu w celu połączenia tych dwóch wartości i zachowania nowego ciągu w zmiennej o nazwie strNewLine:

strNewLine = strLine1 & strLine2

W wyniku tego otrzymamy nowy, poprawiony wiersz 1 naszego pliku. Dlatego też stosujemy poniższy wiersz kodu w celu dodania tego nowego wiersza (wraz ze znakiem powrotu karetki) do zmiennej o nazwie strNewContents:

strNewContents = strNewContents & strNewLine & vbCrLf

Następnie kontynuujemy działanie pętli i powtarzamy ten proces, łącząc wiersz 3 i 4 w pliku tekstowym, a następnie dodajemy także tę wartość do zmiennej strContents. Zanim opuścimy pętlę, zmienna strContents będzie miała następującą wartość:

SID123456789

SID234567891

SID345678912

SID456789123

W tym momencie wywołujemy metodę Close w celu zamknięcia pliku, następnie natychmiast otwieramy ponownie ten sam plik, tym razem do zapisu:

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

Gdy tylko otworzymy plik, stosujemy metodę Write w celu zastąpienia istniejącej zawartości pliku Test.txt wartością zmiennej strNewContents:

objFile.Write strNewContents

W tym momencie zamykamy plik po raz ostatni – i to już koniec pracy. Jak już mówiłem, istny geniusz.

**Uwaga:**Powinniśmy zauważyć, że ten skrypt zadziała tylko w przypadku tekstu zawierającego parzystą liczbę wierszy, jak to było w pliku, na którym cały czas pracowaliśmy. Jednakże jeżeli zdarzy się tak, że będziemy mieli dodatkowy wiersz na końcu pliku, skrypt nie zadziała:

C:\scripts\hey0814.vbs(9, 5) Microsoft VBScript runtime error: Input past end of file

Aby tego uniknąć, możemy tak ustawić nasz skrypt, żeby sprawdził koniec pliku zanim odczyta drugi wiersz, w taki oto sposób:

Const ForReading = 1

Const ForWriting = 2



Set objFSO = CreateObject("Scripting.FileSystemObject")

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



Do Until objFile.AtEndOfStream

    strLine1 = objFile.ReadLine

    strLine2 = ""

    If Not objFile.AtEndOfStream Then

        strLine2 = objFile.ReadLine

    End If

    strNewLine = strLine1 & strLine2

    strNewContents = strNewContents & strNewLine & vbCrLf

Loop



objFile.Close



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

objFile.Write strNewContents

objFile.Close

Zauważcie, że dodaliśmy zdanie If wewnątrz pętli Do Until. Po wczytaniu zmiennej strLine1, usuwamy zawartość strLine2, po czym sprawdzamy, czy ostatni wczytany wiersz był ostatnim wierszem pliku. Jeżeli tak, po prostu omijamy następną ReadLine i tworzymy nowy wiersz (strNewLine) z zawartością zmiennej strLine1 oraz pustą zmienną strLine2. Jeżeli nie jesteśmy na końcu pliku, wczytujemy zmienną strLine2.

Chyba powinienem tutaj z całą szczerością zauważyć, że nie wiem na temat Michała Anioła tyle ile powinienem. Wiem, ze jego zamiłowanie to piękna nie znajdowało odzwierciedlenia jeżeli chodzi o jego własną osobę: Ubierał się marnie, jadł jeszcze gorzej i nigdy się nie kąpał (Naprawdę nigdy.) Był, jak to mówią ekscentrykiem. Według jednej z legend, po ukończeniu jednej z rzeźb, uderzył ją w kolano i zażądał, żeby do niego przemówiła.

Jakby tego było mało, Michał Anioł miał skłonność do ataków depresji. Pod koniec życia zanotował:

„Jestem sam i nieszczęśliwy, uwięziony, Biedny stary, obolały. Wszystko mnie boli i tylko śmierć może być moim wybawieniem.”

Brzmi jak wyznanie Skrypciarza pod koniec pracy.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne