Centrum skryptów - Microsoft office

Jak przekonwertować plik rozdzielony znakami tyldy do formatu Microsoft Excel

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 przekonwertować plik rozdzielony znakami tyldy do formatu Microsoft Excel?

Cześć Skrypciarze! Pytanie

Cześć Skrypciarze! Jak przekonwertować plik rozdzielony znakami tyldy do formatu Microsoft Excel?

-- JN

Cześć Skrypciarze! Odpowiedź

Hej, JN. Wiesz, muszę coś wyznać - zaczynamy zastanawiać się nad zmianą podejścia do tej rubryki. W końcu, zazwyczaj opowiadamy ludziom jak łatwe są różne rzeczy, i jak - bez zbytniego wysiłku - napisać skrypt, który pozwala wykonać pozornie niemożliwe zadanie. Jednak, wczoraj Skryptujący Syn przełączał kanały telewizora, aż trafił na reklamówkę noża - moment, powiedziałem "noża"? To nie był nóż, właściwie to coś nawet nie kroi żywności, to "sonicznie separuje żywność". Chcielibyśmy zobaczyć jak nóż robi coś takiego.

Mimo wszystko, to coś wyglądało na całkiem dobry produkt; jednak pomyśleliśmy sobie, że naprawdę interesująca była sama reklama. "Wiecie jak ciężko przekroić kanapkę na pół?" zapytał narrator. Muszę w tym miejscu przyznać, że krojenie kanapek było jedną z rzeczy, którą Skrypciarz piszący tę rubrykę wydawał się potrafić. Jak się okazuje cały czas się oszukiwał: jak wyraźnie demonstrował materiał, przekrojenie kanapki zwykłym nożem jest niemożliwe.

OK, oczywiście kanapka miała 30 cm grubości, nawet gdyby udało się ją przekroić nożem, nie wiem jak można by ją zjeść. Mimo wszystko, gdy biedaczyna z reklamy próbował kroić wysoką na 30 cm kanapkę, wszystko szło nie po jego myśli: kanapka się rozpadła, pomidory wypadły na podłogę, naprawdę bolało oglądać, jak pyszna kanapka ulega zniszczeniu w taki sposób. "Nie martwcie się" - powiedział narrator. "Takie rzeczy zdarzają się każdemu." Następnie pokazano, jak - chociaż niemożliwe jest przekrojenie grubej na 30 cm kanapki - można sonicznie podzielić 30 cm kanapkę. Alleluja! W końcu piszący tę rubrykę Skrypciarz może coś zrobić z zalegającą w kuchni stertą 30 cm kanapek.

"I co najlepsze: koniec z mięśniami zmęczonymi od krojenia żywności" - dodał narrator. No to zaczynamy: jeśli w trudzie i znoju kroiliście co rano kanapki, a potem czuliście się zmęczeni przez resztę dnia, mamy dla was dobre wieści: ulga jest w zasięgu ręki.

A co to wszystko ma wspólnego z pisaniem skryptów? No cóż, zmusza nas do myślenia. W końcu, jeśli jesteście tacy jak większość, macie zapewne setki rozdzielonych znakiem tyldy plików walających się po komputerze:

Ken Myer~Fiscal Specialist~Accounting 

Pilar Ackerman~Customer Service Representative~Accounting 

Jonathan Haas~Manager~Accounting

Zapewne próbowaliście otwierać je przy użyciu programu Microsoft Excel. Ale co się wtedy dzieje? Katastrofa! Zamiast potraktować znak tyldy (~) jako separator pól, Excel wrzuca po prostu wszystkie dane do kolumny A:

Doliczcie do tego obolałe od otwierania rozdzielonych znakiem tyldy plików mięśnie i cały dzień zmarnowany. Co najgorsze, nie da się absolutnie nic z tym zrobić! Wasze rozdzielone znakiem tyldy pliki są bezużyteczne, mięśnie zmęczone i obolałe, a Wy jesteście skazani na życie w nędzy i rozpaczy.

Uwaga:. Witamy w świecie Skrypciarzy.

A może? Słuchajcie, nie wyrzucajcie jeszcze tych rozdzielanych znakiem tyldy plików. Zamiast tego skorzystajcie z opatentowanej przez Skrypciarzy technologii sonicznego rozdzielania danych, aby przekonwertować je na coś, co Excel potrafi poprawnie otworzyć:

Const ForReading = 1

Const ForWriting = 2



Set objFSO = CreateObject("Scripting.FileSystemObject")



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

strContents = objFile.ReadAll

objFile.Close



strContents = Replace(strContents, "~", vbTab)



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

objFile.Write strContents

objFile.Close



Set objExcel = CreateObject("Excel.Application")

objExcel.Visible = True



Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.txt")

Z pewnością mówicie teraz: "technologia sonicznego rozdzielania danych? Jak to działa?" Sprawdźmy, czy uda nam się wyjaśnić. Ponieważ JN chciał skonwertować pliki rozdzielone znakiem tyldy, musimy pozbyć się tyld i zamienić je na coś, co Excel rozpozna jako delimiter (konkretnie znak tabulatora). To właśnie robimy tutaj:

Zaczynamy od zdefiniowania pary stałych (ForReading i ForWriting) potrzebnych przy otwieraniu rozdzielonego znakami tyldy pliku tekstowego (C:\Scripts\Test.txt). Mając w zanadrzu przygotowane stałe, za pomocą tego wiersza kodu tworzymy egzemplarz obiektu Scripting.FileSystemObject:

Set objFSO = CreateObject("Scripting.FileSystemObject")

Gdy już mamy egzemplarz FileSystemObject, możemy użyć poniższego bloku kodu do otworzenia pliku tekstowego, wczytania całej jego zawartości do zmiennej strContents i zamknięcia pliku:

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

strContents = objFile.ReadAll 

objFile.Close

Po co to wszystko? Cóż, nie możemy bezpośrednio działać na pliku, klasa FileSystemObject nie pozwala na to. Musimy więc otworzyć plik, zachować jego zawartość w pamięci i pracować na tej wirtualnej kopii pliku. Po dokonaniu zmian (to jest, po zamianie wszystkich znaków tyldy na tabulatory), otworzymy ponownie plik i zapiszemy zmodyfikowaną zawartość do Test.txt.

No to chodźmy i zróbmy to teraz. Aby zamienić znaki tyldy, skorzystamy z funkcji VBScript Replace, zamieniając wszystkie wystąpienia ~ tabulatorami (reprezentowanymi przez stałą vbTab):

strContents = Replace(strContents, "~", vbTab)

Zmieniamy w ten sposób wirtualną kopię pliku tekstowego. Następnie otwieramy właściwy plik (tym razem do zapisu), używamy metody Write, żeby podmienić zawartość pliku i zamykamy Test.txt:

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

strContents = objFile.ReadAll 

objFile.Close

Wierzycie, czy nie, to jest tak proste: opatentowana technologia sonicznego rozdzielania danych przekonwertowała plik Test.txt na format, który może być otwierany przez program Excel - i to otwierany poprawnie. Ciężko w to uwierzyć? Rozumiemy. Dlatego na końcu skryptu dodaliśmy blok kodu, który tworzy egzemplarz Microsoft Excel, uwidacznia go, a następnie otwiera plik C:\Scripts\Test.txt:

Set objExcel = CreateObject("Excel.Application") 

objExcel.Visible = True



Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.txt")

A to pojawi się na ekranie:

Czy to nie najwspanialsza rzecz jaka przytrafiła się w historii ludzkości? Może i nie. Nie możemy sobie jednak przypomnieć niczego lepszego.

Coś sceptyczni jesteście. “To jest całkiem niezłe, Skrypciarze. Ale co, jeśli nie chcę konwertować pliku tekstowego? Co jeśli chcę go tylko otworzyć, zostawiając tyldy na swoich miejscach? Zgaduję, że mam pecha, tak?

Pecha? Wprost przeciwnie: to Twój szczęśliwy dzień. A to dlatego, że bez dodatkowych opłat, dołączyliśmy nasz opatentowany soniczny filtr importu danych, który pozwala importować rozdzielone znakami tyldy pliki do programu Excel, i to bez konieczności jakichkolwiek modyfikacji pliku! Nie mamy już dziś czasu, żeby omówić jego działanie, ale wystarczy dołączyć filtr importu danych i już można importować:

Const xlDelimited  = 1



Set objExcel = CreateObject("Excel.Application") 

objExcel.Visible = True



objExcel.Workbooks.OpenText "C:\Scripts\Test.txt",,,xlDelimited,,,,,,,True,"~"

Tak, ten skrypt wygląda trochę dziwacznie, przynajmniej ostatni wiersz. To dlatego, że metoda OpenText zawiera kilka parametrów, które nie są nam do niczego potrzebne. Nie będziemy ich używać, jednak musimy zostawić puste miejsce dla każdego z nich. W rezultacie dostajemy szereg pustych parametrów. Co istotne, to to, że mówimy programowi Excel, że pracujemy na tekstowym pliku rozdzielonym (xlDelimited), że używamy niestandardowego delimitera (True), i że tym niestandardowym delimiterem jest znak tyldy (~).

Wspominaliśmy, że soniczny separator danych Skrypciarzy jest dostępny teraz za jedyne 29.99zł? Zadzwoń teraz, a dostaniesz całkowicie za darmo soniczny filtr importu danych! Oferta ograniczona czasowo, więc nie zwlekaj: nasi operatorzy czekają na zamówienia.

Uwaga:. Soniczny separator danych Skrypciarzy nie jest dostępny w sklepach. Nie bez powodu.
 Do początku strony Do początku strony

 Centrum skryptów - Microsoft office