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