Centrum Skryptów - Systemy Operacyjne

W jaki sposób mogę usunąć ostatni znak powrotu karetki i przesunięcia o 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 mogę usunąć ostatni znak powrotu karetki i przesunięcia o wiersz w pliku tekstowym?

Cześć, Skrypciarzu! W jaki sposób mogę usunąć ostatni znak powrotu karetki i przesunięcia o wiersz w pliku tekstowym?

-- Romek

Cześć, Romku. Z dalszego ciągu Twojego e-maila wynika, że używasz obiektu FileSystemObject do odczytania pliku tekstowego, po czym zawartości tego pliku używasz jako zapytania w innej aplikacji. Niestety każdy plik tekstowy ma na końcu znak powrotu karetki i przesunięcia o wiersz, co powoduje problemy przy próbie wykorzystania zawartości pliku jako zapytania.

Co to wszystko oznacza? Weźmy na przykład taki krótki plik tekstowy jak poniżej. Otworzyliśmy plik, po czym nacisnęliśmy Ctrl+End, aby umieścić kursor na jego końcu. Zwróćmy uwagę, że kursor nie pojawia się zaraz po kropce w pierwszym wierszu, ale na początku wiersza 2. To właśnie wynik działania znaku powrotu karetki i przesunięcia o wiersz (tak jakby ktoś po napisaniu pierwszego zdania nacisnął ENTER). Na ekranie nie robi to dużej różnicy, ale różnica jest i sprawia problemy:

Jak się zatem pozbędziemy tej wrednej karetki? Spójrzmy:

  • Najpierw otworzymy plik i odczytamy jego zawartość jako zmienną o nazwie strFile.
  • Wychwycimy dwa ostatnie znaki tej zmiennej. Czemu dwa znaki? Otóż, interesujący nas znak to tak naprawdę dwa znaki: powrót karetki (wartość ASCII równa 13) i przesunięcie o wiersz (wartość ASCII równa 10). Moglibyśmy co prawda zadowolić się skasowaniem przesunięcia o wiersz, ale postąpimy z chirurgiczną precyzją i pozbędziemy się obu.
  • Sprawdzimy czy ostatnie znaki mają wartości ASCII równie 13 i 10; najłatwiej zrobić to porównując je ze stałą języka VBScript o nazwie vbCrLf (odpowiadającej właśnie powrotowi karetki i przesunięciu o wiersz). Jeśli wartości będą się zgadzać, wyrzucimy dwa ostatnie znaki z naszego ciągu i zapiszemy ją w naszym pliku tekstowym. Jeśli wartości nie będą się zgadzać, nie będziemy nic robić.

Nadążacie? Oto skrypt który zajmie się tym wszystkim:

Const ForReading = 1

Const ForWriting = 2



Set objFSO = CreateObject("Scripting.FileSystemObject")



Set objFile = objFSO.OpenTextFile("C:\scripts\test.txt", ForReading)

strFile = objFile.ReadAll

objFile.Close



intLength = Len(strFile)

strEnd = Right(strFile, 2)



If strEnd = vbCrLf Then

    strFile = Left(strFile, intLength - 2)

    Set objFile = objFSO.OpenTextFile("C:\scripts\test.txt", ForWriting)

    objFile.Write strFile

    objFile.Close

End If

Najpierw definiujemy dwie stałe (ForReading i ForWriting), których używać będziemy pracując z plikiem tekstowym. Tworzymy wystąpienie obiektu FileSystemObject i otwieramy plik C:\Scripts\Test.txt za pomocą metody OpenTextFile. Następnie używamy metody ReadAll, by odczytać całą zawartość pliku tekstowego i przechować ją w zmiennej strFile. Teraz zamykamy plik tekstowy. (Dlaczego? Otóż, FileSystemObject umożliwia otwarcie pliku w celu odczytania lub zapisania. Chcieliśmy najpierw odczytać plik, więc otworzyliśmy go do odczytania; jeśli będziemy chcieli wprowadzić w nim zmiany, otworzymy go ponownie w celu zapisania. Nie będziemy go już odczytywać, więc można go zamknąć.)

Następnie za pomocą funkcji Len określamy długość zmiennej strFile (czyli liczbę znaków w ciągu). Wartość ta – wykorzystamy ją za chwilę – przechowywana jest w zmiennej intLength.

Jak dotąd idzie gładko. Teraz musimy określić, czy nasz plik posiada na końcu znak powrotu karetki i przesunięcia o wiersz. Jak mówiliśmy wcześniej, wiąże się to ze sprawdzeniem ostatnich dwóch znaków. Używamy więc funkcji Right, by pobrać dwa ostatnie znaki i przechowujemy je w zmiennej strEnd. Odpowiada za to poniższy fragment:

strEnd = Right(strFile, 2)

Następnie możemy sprawdzić, czy wartość strEnd jest równa stałej vbCrLf. Jeśli tak, możemy za pomocą poniższego wiersza pobrać wszystkie znaki oprócz dwóch ostatnich:

strFile = Left(strFile, intLength - 2)

Jak pamiętamy, użyliśmy funkcji Len do określenia liczby znaków w ciągu. Teraz za jej pomocą pobierzemy wszystkie znaki oprócz ostatnich dwóch; jeśli nasz ciąg liczył sobie 37 znaków, weźmiemy ich tylko 35, pomijając w ten sposób powrotu karetki i przesunięcie o wiersz.

Następnie otwieramy po raz drugi – tym razem do zapisu – nasz plik tekstowy i zastępujemy jego zawartość pobranym przed chwilą ciągiem. W ten sposób uzyskamy cały plik tekstowy, skrócony jedynie o powrót karetki i przesunięcia o wiersz. A o to nam właśnie chodziło.

Do początku strony Do początku strony


Centrum Skryptów - Systemy Operacyjne