Centrum skryptów - Systemy operacyjne

Jak wstawić do pliku tekstowego znak podziału strony po każdym wierszu, w którym jedynym znakiem jest liczba 1?

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 wstawić do pliku tekstowego znak podziału strony po każdym wierszu, w którym jedynym znakiem jest liczba 1?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Poradźcie mi, jak mam otworzyć plik tekstowy i wstawić znak podziału strony po każdym wierszu składającym się tylko z liczby 1.

-- JR

Cześć Skrypciarze! Odpowiedź

Jak to dobrze, że czytelnicy naszych artykułów nie zadają mi pytań o najnowsze trendy w modzie, a nawet pomijają tak kłopotliwe tematy jak garsonka, legginsy, spodnium, czy inne słowa, które przy pierwszym słuchaniu wywołują u mnie podejrzenie, że ktoś mnie obraża lub przynajmniej chce bardzo skonfundować. Dobrze, że mogę zawsze na Was liczyć w tych sprawach, bo przecież jako zobowiązany do odpowiedzi na wszystkie pytania internautów, muszę liczyć się z tym, że czasem pytania mogą być niespodziewane. Na niektóre żargony, oprócz skrypciarskiego oczywiście, jestem bowiem wybitnie uczulony. Ale nie musimy czuć się winni ani trochę, założę się, że wiele osób nie rozumie, co może kryć się pod hasłem „otworzyć plik tekstowy i wstawić znak podziału strony po każdym wierszu składającym się tylko z liczby 1”. Na całe szczęście Wy to wiecie. Tak więc w podzięce za to, że używacie takich sformułowań, a nie słów w rodzaju spodnium, garsonka czy bolerko, przedstawiam skrypt, o który prosił mnie JR:

Const wdReplaceAll = 2



Set objWord = CreateObject("Word.Application")

objWord.Visible = True



Set objDoc = objWord.Documents.Open("C:\Scripts\Test.txt")

Set objSelection = objWord.Selection

objSelection.Find.Text = "^p1^p"

objSelection.Find.Forward = TRUE

objSelection.Find.Replacement.Text = "^p1^p^m"



objSelection.Find.Execute ,,,,,,,,,,wdReplaceAll

Trudno nie zauważyć, że do otwierania pliku i wstawiania do niego znaków podziału strony używamy programu Microsoft Word. Dlaczego? Z tego co wiemy, to chyba jedyna metoda, umożliwiająca otworzenie pliku tekstowego i wstawienie znaku podziału strony. Obiekt FileSystemObject nie jest bowiem w stanie tego zrobić, zresztą plik tekstowy w takim wypadku sam nie wiedziałby co zrobić z takimi znakami podziału strony (Spróbujcie wyszukać komendę „wstaw znak podziału strony” w Notatniku, gwarantujemy problemy większe niż garsonka XXXL). Właśnie dlatego nasz tekst otwieramy w programie Word, wstawiamy znaki podziału strony, a potem zapisujemy plik jako dokument programu Word. (ten etap pominęliśmy w przykładzie, zakładamy bowiem, że każdy, po zapoznaniu się z tysiącem skryptów napisanych przez nas na ten temat, wie już, jak zapisać taki dokument). Przyznajemy wprawdzie, że w tym momencie nie mamy już pliku tekstowego, ale nie wiemy, jak to obejść.

Przejdźmy do opisu działania naszego skryptu. Najpierw definiujemy stałą wdReplaceAll i ustawiamy jej wartość na 2 (dlaczego tak, wyjaśnimy za moment), następnie tworzymy wystąpienie obiektu Word.Application i ustawiamy jego właściwość Visible na True; uzyskujemy tym samym uruchomione i widoczne na ekranie wystąpienie programu Microsoft Word. Kolejnym naszym krokiem będzie użycie poniższych wierszy kodu, które otwierają plik C:\Scripts\Test.txt i tworzą wystąpienie obiektu Selection w programie Word:

Set objDoc = objWord.Documents.Open("C:\Scripts\Test.txt")

Set objSelection = objWord.Selection

Po co nam wystąpienie obiektu Selection? Do wykonania operacji wyszukaj-i-zastąp (do której to zaraz przystąpimy), musimy użyć obiektu Find, który jest po prostu obiektem podrzędnym obiektu Selection.

Nadążacie? Jak się okazuje, plik przesłany przez JR wygląda w następujący sposób:

Here's some text.

1

Here’s some more text.

1

Here's even more text.

And more text.

1

And here's the last bit of text.

Teraz należy tylko wstawić znak podziału strony po każdym wierszu, w którym występuje jedynie cyfra 1.

Musimy wyszukać wszystkie cyfry 1, które stanowią wiersz sam w sobie. Jak stwierdzić czy w danym wierszu nie ma żadnych innych znaków niż nasza cyfra 1? Betka. Jeżeli mamy znak początku akapitu, po którym następuje cyfra 1, po której to znowu następuje znak początku akapitu, wiemy, że trafiliśmy właśnie na wiersz zawierający jedynie cyfrę 1. (Dla tych, którzy lepiej się znają się na bolerkach niż na kodach: tworzymy nowy dokument programu Word, naciskamy klawisz ENTER, wpisujemy 1, po czym znowu naciskamy klawisz ENTER. Voila!) Następny wiersz kodu umożliwia nam określenie tekstu wyszukiwania (właściwość Text), który składa się ze znaku początku akapitu (^p w składni programu Word), po którym następuje cyfra 1, po której to następuje kolejny znak początku akapitu.:

objSelection.Find.Text = "^p1^p"

Zdefiniowaliśmy tekst, który chcemy wyszukać. Następnie ustawiamy wartość właściwości Forward na True (dzięki temu skrypt zaczyna przeszukiwanie od zaznaczonego w tej chwili miejsca i kontynuuje przez resztę dokumentu). Ponieważ nasze miejsce zaznaczenia jest na samym początku dokumentu (domyślne ustawienie w trakcie tworzenia obiektu Selection), możemy być pewni, że skrypt przeszuka cały dokument od początku do końca:

Następnie definiujemy tekst, który zastąpi dotychczasowy:

objSelection.Find.Replacement.Text = "^p1^p^m"

W naszym tekście szukamy następującego fragmentu: ^p1^p. i zastępujemy go takim fragmentem: ^p1^p^m. Macie rację, ^m w składni programu Word oznacza ręczny podział strony. Jak wygląda nasz efekt końcowy? Otóż po każdym wierszu, w którym występuje jedynie cyfra 1, następuje automatycznie podział strony. O to nam przecież chodziło, no nie?

Teraz pozostało nam juz przywołanie metody Execute i samo juz wyszukanie i zastąpienie:

objSelection.Find.Execute ,,,,,,,,,,wdReplaceAll

Nie będziemy omawiać tu pustych parametrów dla tej operacji, wszystkie wątpliwości wyjaśnia artykuł Office Space (j.ang.) na temat wyszukiwania i zastępowania tekstu w dokumencie programu Word. Pamiętać jednak należy o wszystkich przecinkach, dzięki nim bowiem zmienna wdReplaceAll ustawia się w prawidłowym miejscu. Również dzięki tej właśnie zmiennej, wszystkie wystąpienia naszego tekstu docelowego zostają odpowiednio zastąpione (bez niej nasz skrypt zamieniłby tylko pierwsze wystąpienie i na tym poprzestał).

I tyle. Teraz macie pewnie jeszcze niedosyt słownikowy, bo do tłumaczenia skryptu starałem się używać słów zrozumiałych, ale niech i tej zachciance stanie się zadość, moja mantra na dziś: bolerko, garsonka, spodnium, tunika, legginsy, żaboty, szmizjerka, baskinka, pliska, godety i inne obraźliwe słowa.

Do tego pozostaje jeszcze rolmops, eskalopki i antrykot, ale to już inny żargon, na zupełnie inny artykuł...

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne