Centrum skryptów - Systemy operacyjne

Jak pobrać tekst osadzony między dwiema frazami kluczowymi 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 pobrać tekst osadzony między dwiema frazami kluczowymi w pliku tekstowym?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Chcę odczytywać plik tekstowy, dopóki nie dotrę do określonej frazy, a następnie zapisać te informacje w nowym pliku tekstowym. Następnie chcę powtórzyć ten proces, odczytując plik tekstowy do kolejnego wystąpienia tej frazy i zapisać te informacje w innym pliku tekstowym, itd. Jak to zrobić?

-- EW

Cześć Skrypciarze! Pytanie

Cześć, EW. Jak zapewne wiesz, ten rok był dość okrutny dla naszego zespołu skrypciarskiego. W lutym musieliśmy się pożegnać ze Skrypciarzem Peterem Constantinim, który opuścił nas, przechodząc na wyższy szczebel drabiny, i został Project Managerem. Nie dawniej jak dwa tygodnie temu machaliśmy na „do widzenia” Deanowi Tsaltsasowi, który to, nadal pracując dla firmy Microsoft, przeniósł się z powrotem do Halifaksu w Nowej Szkocji. Dziś natomiast przypadł mi przykry obowiązek oficjalnego pożegnania się ze Skrypciarką Jean Ross.

Żegnamy Cię zatem ze łzami w oczach...

Przepraszam na chwileczkę...

„Jak to: nie odchodzisz?”

„No po prostu nie odchodzę”

„Ale ja już napisałem artykuł z peanem pochwalnym na Twoja cześć, więc teraz już musisz odejść.”

„No ale się rozmyśliłam, więc może walnij pean, a potem wklej te nasze rozmówki z Messengera. Czytelnicy nie są głupi i zrozumieją, a Ty będziesz mógł tym samym wkleić swoją twórczość. Kto wie, może dostaniesz podwyżkę :p”

Wklejam niniejszym. Tak, zdaję sobie sprawę, że nie zaczyna się zdania od „ale”, ale na messengerze pozwalam sobie czasem na odrobinę swobody lingwistycznej...

Musimy jeszcze, już bez wklejania, omówić ten problem z Jean. W międzyczasie gorąco zachęcam Państwa do zapoznania się ze skryptem, dzięki któremu EW będzie mógł (lub mogła) odczytać tekst do jakiegoś konkretnego miejsca i zapisać te dane w pliku tekstowym, a potem zrobić to samo aż do innej frazy kluczowej w tekście:

Const ForReading = 1



Set objFSO = CreateObject("Scripting.FileSystemObject")

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



strContents = objFile.ReadAll



objFile.Close



arrContents = Split(strContents, "#This is the end of the file.#")



i = 1



For Each strItem in arrContents

    strFileName = "C:\Scripts\NewFile_" & i & ".txt"

    Set objNewFile = objFSO.CreateTextFile(strFileName)

    objNewFile.Write strItem

    objNewFile.Close

    i = i + 1

Next

Zanim wyjaśnimy jak działa powyższy skrypt, przyjrzyjmy się na chwilę naszemu przykładowemu plikowi tekstowemu, plikowi, który wygląda w następujący sposób:

Here is some text in our document.#This is the end of the file.#Here is 

some more text in the document.#This is the end of the file.#Here is 

the last bit of text in the document. #This is the end of the file.#

Uwaga: Jak widać gołym okiem jest to tekst samej Jean Ross, to szkic napisany na potrzeby kolejnego odcinka Skrypciarskiego Przedszkola. Teraz już wiecie, czemu będzie jej nam tak brakowało...

Lub brakowało-BY, gdyby się w końcu namyśliła i postanowiła jednak odejść…

Jeżeli przyjrzeć się dokładniej plikowi tekstowemu, fraza #This is the end of the file.# pojawia się kilkakrotnie w różnych miejscach. Tak, piątka (lub szóstka) dla domyślnych – to jest właśnie nasza fraza kluczowa, fraza oddzielająca jeden fragment tekstu od drugiego. Oznacza to, że przed naszym skryptem stoi następujące zadanie:

  • Odczytać tekst Here is some text in our document.
  • Po natrafieniu na frazę kluczową, zapisać poprzedzający tekst do pliku tekstowego (pomijając frazę kluczową)
  • Odczytać tekst Here is some more text in the document.
  • Po natrafieniu na frazę kluczową , zapisać poprzedzający tekst do pliku tekstowego.
  • Odczytać tekst Here is the last bit of text in the document. I zachować to w trzecim pliku tekstowym.

Skomplikowane, nieprawdaż? Chociaż w sumie nie aż tak skomplikowane...

Zaczynamy zdefiniowania stałej ForReading i nadania jej wartości 1; stałej tej będziemy używać do otworzenia pliku tekstowego C:\Scripts\Test.txt. Następnie używamy poniższych dwóch wierszy kodu do utworzenia wystąpienia obiektu Scripting.FileSystemObject i otworzenia pliku Test.txt do odczytu:

Set objFSO = CreateObject("Scripting.FileSystemObject")

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

Po otworzeniu pliku, używając metody ReadAll, odczytujemy całą zawartość pliku, przechowując dane w zmiennej strContents. Po zapisaniu całej zawartości w pamięci, wywołujemy metodę Close i zamykamy nasz Test.txt. Na dobre.

To wszystko to tylko preludium do następującego wiersza kodu:

arrContents = Split(strContents, "#This is the end of the file.#")

Cel naszych działań jest na szczęście jasno określony – chodzi o zidentyfikowanie i zapisanie tekstu, który występuje pomiędzy wystąpieniami frazy kluczowej. Można to zrobić na wiele różnych sposobów, zdecydowaliśmy się jednak na najmniej skomplikowaną z metod – metodę Split, i rozdzielamy tekst w tablicy arrContents. W którym momencie rozdzielamy plik? Bingo! Po każdym nastąpieniu frazy kluczowej! (Nie każdy o tym wie, ale funkcja Split umożliwia zastosowanie więcej niż jednego znaku – takiego jak przecinek czy znak powrotu karetki – jako delimitera podczas rozdzielania ciągu).

Co uzyskaliśmy w ten sposób? Po wywołaniu funkcji Split, tablica arrContents będzie zawierała następujące elementy:

  • Here is some text in our document.
  • Here is some more text in the document.
  • Here is the last bit of text in the document.

Tak, macie rację – to są właśnie nasze trzy fragmenty, które trzeba pobrać z pliku (tj. właśnie te elementy występują pomiędzy frazami kluczowymi) Najprostszą metodą ich uzyskania było posłużenie się funkcją Split , która zapisuje w tablicy szukane fragmenty tekstu, pomijając tym samym frazy kluczowe.

Reszta to betka. Po przypisaniu wartości 1 do zmiennej licznika o nazwie i, uruchamiamy pętlę For Each i przechodzimy przez wszystkie elementy w arrContents:

For Each strItem in arrContents

Wewnątrz pętli używamy poniższego wiersza kodu, aby utworzyć ścieżkę pierwszego pliku tekstowego:

strFileName = "C:\Scripts\NewFile_" & i & ".txt"

Łączymy tutaj ciąg C:\Scripts\NewFile_ z wartością zmiennej licznika i wartością ciągu .txt. Utworzy to następującą ścieżkę:

C:\Scripts\NewFile_1.txt

Teraz mamy już ścieżkę pliku, możemy więc wywołać metodę CreateTextFile i utworzyć nowy plik tekstowy:

Set objNewFile = objFSO.CreateTextFile(strFileName)

Co zamierzamy przechowywać w pliku tekstowym? Zgadza się, wartość pierwszego elementu z tablicy arrContents. Aby zapisać te dane do pliku musimy już tylko wywołać metodę Write, podając zmienną strItem jako jej jedyny parametr:

objNewFile.Write strItem

Teraz pozostało nam już tylko zamknąć plik, powiększyć wartość licznika o 1, a następnie powtórzyć cały proces z następnym elementem tablicy. Po zakończeniu operacji, nasz skrypt wygeneruje trzy oddzielne pliki tekstowe, jeden dla każdego elementu w tablicy:

C:\Scripts\NewFile_1.txt

C:\Scripts\NewFile_2.txt

C:\Scripts\NewFile_3.txt

Jak to mówią po angielsku: that’s it!

Na zakończenie dobra wiadomość dla wszystkich, którzy czytali powyższy artykuł z pewną dozą niepewności, lęku itp. – po dokonaniu wizji lokalnej okazuje się, iż Skrypciarka Jean Ross pozostaje jednak w naszych szeregach i będzie Was raczyć tym samym fascynującymi skryptami od czasu do czasu. Pean pozostawiam więc do następnego odejścia kogoś z redakcji, zastępie tylko Jean jakimś innym imieniem...

Moim własnym? Wypraszam to sobie!!!

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne