Parametry ciągu połączenia dla źródeł plików tekstowych
W poprzednim artykule omówiłem parametry parametrów połączenia dla źródeł danych Excel. Skupimy się teraz na plikach tekstowych. Istnieją różne metody opisywania schematu plików tekstowych i wykorzystywania informacji podczas otwierania lub łączenia w programie Access. Podczas gdy arkusze kalkulacyjne Excela miały pewne podobieństwo struktury, nie dotyczy to plików tekstowych. Musimy odpowiedzieć na kilka pytań dotyczących struktury pliku tekstowego, w tym:
- Czy jest rozgraniczona czy stała?
- Jak stwierdzić, kiedy jedna kolumna się kończy, a druga zaczyna?
- Czy tekst jest cytowany, czy nie?
- Jak powinniśmy analizować daty i godziny?
- A co z kwotami w walutach? Jak powinny być sformatowane?
i być może więcej. Chociaż na pierwszy rzut oka CSV może wydawać się dobrze zdefiniowany, ale kiedy się do niego zagłębisz, w rzeczywistości jest bardzo luźno zdefiniowany. Nie ma powszechnej zgody co do tego, czy tekst powinien być cytowany, jak należy sformatować daty. Z tych wszystkich powodów używanie plików tekstowych zwykle wymaga użycia pewnego rodzaju informacji o schemacie w celu opisania struktury pliku tekstowego. Istnieją trzy sposoby przechowywania informacji o schemacie:
schema.ini
plik przechowywany w katalogu- Dostęp”
MSysIMEX
iMSysIMEXColumns
stoły - Dostęp”
ImportExportSpecification.XML
nieruchomość.
Aby skomplikować sprawę, istnieje kilka różnych metod, których możemy użyć do pracy z plikami tekstowymi, ale nie wszystkie metody mogą wykorzystywać wszystkie 3 różne sposoby uzyskiwania informacji o schemacie. Na przykład DoCmd.TransferText
działa z tabelami systemowymi, ale nie ma zapisanych importów/eksportów. Z drugiej strony DoCmd.RunSavedImportExport
działa z ImportExportSpecification
obiekt. Jednak ImportExportSpecification
nie jest używany w ramach linkowania. Tak więc do naszej dyskusji w rzeczywistości mamy tylko 2 metody dostępne w kontekście otwierania lub linkowania do pliku tekstowego. Należy zwrócić uwagę na różnicę między zapisywaniem specyfikacji w MSysIMEXSpecs
&MSysIMEXColumns
tabele a zapisywanie importu/eksportu, który staje się ImportExportSpecification
obiekt. Omówimy te 2 metody w następnych artykułach.
Ciąg połączenia dla pliku tekstowego
Powinniśmy zastanowić się, jak Access będzie postrzegał plik tekstowy. W poprzednim artykule widzieliśmy, że każdy arkusz lub nazwany zakres był reprezentowany jako „tabela” w „bazie danych” arkusza kalkulacyjnego Excel. Ale plik tekstowy nie ma takiej konstrukcji. Co zatem tworzy „bazę danych”? Odpowiedź jest taka, że folder reprezentuje „bazę danych”, a zatem wszelkie pliki tekstowe w folderze są „tabelami”. Z tego powodu możliwe jest posiadanie wielu informacji o schemacie dla tego samego folderu, jeśli ten folder zawiera więcej niż jeden możliwy format dowolnych plików tekstowych przechowywanych w folderze. Zobaczysz później, że kiedy tworzymy ciąg połączenia, łączymy się z folderem, a następnie uzyskujemy dostęp do pojedynczego pliku jako tabeli.
Dlatego użyj tej konfiguracji, jak pokazano:
Następnie możemy otworzyć plik tekstowy za pomocą tego kodu VBA:
Dim db As DAO.Database Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Text;DATABASE=C:\Links") Dim tdf As DAO.TableDef For Each tdf In db.TableDefs Debug.Print tdf.Name Dim fld As DAO.Field For Each fld In tdf.Fields Debug.Print fld.Name, Next Debug.Print Dim rs As DAO.Recordset Set rs = tdf.OpenRecordset Do Until rs.EOF For Each fld In rs.Fields Debug.Print fld.Value, Next Debug.Print rs.MoveNext Loop Debug.Print Next
Powinno to dać wynik:
Products#csv Products Count PackDate Amount ShipDate Apples 3 12/4/2020 $ 1.02 4/12/2020 Bananas 5 4/12/2020 $ 1,234.56 12/4/2020 Figs 8 5/7/2020 $ 0.01 7/5/2020 Grapes 11 10/10/2020 $12.30 10/10/2020
Zwróć uwagę na następujące rzeczy:
- Nie określiliśmy pliku tekstowego w naszych parametrach połączenia. Zamiast tego użyliśmy folderu.
- Nazwy „tabel” zostały zmienione, ponieważ kropka w nazwie nie jest prawidłowym znakiem. Ergo,
products.csv
stał sięproducts#csv
. - W porównaniu z Excelem, nie ma obowiązkowych parametrów poza określeniem sterownika pliku tekstowego i ścieżki do folderu.
W następnym artykule dowiesz się więcej o opisie schematu plików tekstowych. Jednak w przypadku samego ciągu połączenia rozpoznawane są następujące słowa kluczowe.
FMT
parametr:Wskaż format pliku tekstowego.
Delimited
:Plik jest oddzielony znakiem. Używany znak jest określony przez informacje o schemacie.
Fixed
:Plik ma ustaloną szerokość dla kolumn. Ponownie, konkretne szerokości kolumn są określone w informacjach o schemacie.
HDR
parametr:Wiersz nagłówka
YES
:Pierwszy wiersz jest nagłówkiem i powinien stać się nazwami kolumn dla „tabeli”/”zestawu rekordów”
NO
:Pierwszy wiersz nie jest traktowany inaczej i zawiera tylko dane. Wszystkie nazwy kolumn będą miały nazwę „FN”, gdzie „N” jest liczbą zaczynającą się od 1
IMEX
parametr:Zachowanie importu/eksportu
To reguluje sposób definiowania typów danych kolumn na podstawie zawartości:
1
:Jeśli kolumna zawiera różne typy danych, potraktuj ją jako ciąg. W przeciwnym razie dopasuj kolumnę do najlepszego typu danych.
2
:Zawsze dopasowuj kolumnę do określonego typu danych na podstawie próbki. Może to spowodować błąd w odczycie, gdy odczytamy wiersz zawierający dane, które nie pasują do oczekiwanego typu danych.
ACCDB
parametr:wskazuje, że program Access używa formatu pliku ACCDB?
Domyślnie jest to zawsze ustawione ACCDB=YES w formacie pliku accdb. Jednak pominięcie go lub ustawienie go na NIE wydaje się nic nie robić. To trochę tajemnica. Jeśli ktoś może podzielić się wpływem tego parametru, opublikuj w komentarzu, a ja zaktualizuję bloga.
DATABASE
parametr:Ścieżka do folderu zawierającego pliki tekstowe
Parametr powinien zawierać w pełni kwalifikowaną ścieżkę. Nie powinno zawierać nazw plików tekstowych.
CharacterSet
Parametr:Identyfikuje kodowanie znaków używane do odczytywania plików tekstowych.
Zostanie to omówione bardziej szczegółowo w następnym artykule. Można to również opisać w informacji o schemacie.
DSN
Parametr:Identyfikuje informacje o schemacie do użycia z plikiem tekstowym.
Nazwa musi odpowiadać MSysIMEXSpec
, który zostanie przeanalizowany w dalszej części artykułu. Działa to tylko z MSysIMEX***
tabele. Jeśli chcesz użyć schema.ini
, po prostu nie dołączasz żadnego DSN
w parametrach połączenia.
Należy pamiętać, że sterownik pliku tekstowego uwzględni tylko parametry wymienione powyżej. Nie jest możliwe wpisanie innych słów kluczowych i przeanalizowanie ich przez sterownik pliku tekstowego. Z tego powodu nie będziesz w stanie określić wszystkich szczegółów pliku tekstowego na podstawie samego ciągu połączenia.
Domyślny schemat plików tekstowych
Teoretycznie możesz otworzyć lub połączyć plik tekstowy bez żadnych informacji o schemacie, ale to rzadko działa. W takiej sytuacji program Access po prostu przyjmie wartości domyślne dla różnych opcji. Jeśli plik tekstowy jest zgodny ze wszystkimi bieżącymi ustawieniami domyślnymi, program Access pomyślnie odczyta plik. Co ważniejsze, brak błędów w otwieraniu lub łączeniu do pliku tekstowego nie oznacza, że dane są reprezentowane w sposób znaczący. Na przykład kwoty w specjalnie sformatowanych walutach mogą być interpretowane jako tekst, a nie waluta, a tekst nierozdzielany przecinkami w tekście może zostać źle przeanalizowany, dodając niechciane kolumny. Wartości domyślne są określane w dwóch możliwych miejscach:
- Dostęp sprawdzi ustawienia rejestru. W przypadku instalacji usługi Office 365 rejestr może znajdować się pod adresem:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Text
. W następnych artykułach będziemy określać tę lokalizację jako „klucze rejestru tekstowego”. - Ustawienia, które zobaczysz w
Region
aplet w panelu sterowania Windows. Tę lokalizację będziemy nazywać „ustawieniami systemu Windows”.
Uwaga na temat kodowania plików tekstowych
Prawidłowe kodowanie jest obowiązkowe bez względu na to, jakich metod możesz użyć, aby uzyskać dostęp do plików tekstowych. Gdy zawartość pliku tekstowego jest ograniczona tylko do znaków w dolnej połowie punktów ASCII (np. 0-127), nie ma znaczenia, jakie kodowanie wybierzesz dla plików tekstowych. Wartość domyślna jest zwykle wystarczająca. Jeśli jednak Twoje pliki tekstowe mogą zawierać dowolny kod Unicode lub dowolne znaki większe niż 127, to Ty, programista, musisz znać kodowanie. Jeśli określono nieprawidłowe kodowanie, tekst może nie zostać zaimportowany zgodnie z oczekiwaniami i nie spowoduje żadnych błędów. Po niechlujne szczegóły odsyłam Cię w tej sprawie do Joela Spolsky'ego.
Wybieranie między schema.ini
i MSysIMEX***
stoły
Jak zobaczysz w kolejnych artykułach, obie metody mają dość duże nakładanie się możliwości. W związku z tym może się okazać, że masz wybór, czy użyć jednego z nich. Główna różnica sprowadza się do tego, czy chcesz, aby schemat był przechowywany w aplikacji, czy w folderze, w którym powinny znajdować się pliki tekstowe. Kiedy używasz schema.ini
plik, zakładasz, że pliki tekstowe będą znajdować się w określonym folderze i będą miały określoną nazwę.
Z MSysIMEX***
, możesz przetwarzać dowolne pliki tekstowe z dowolnego miejsca, po prostu odwołując się do zdefiniowanej specyfikacji. Edycja specyfikacji poza programem Access nie jest jednak łatwa. Nawet w programie Access nie jest łatwo dostosować specyfikacje za pomocą interfejsu użytkownika. schema.ini
ma kilka dodatkowych funkcji, które nie są bezpośrednio dostępne w MSysIMEX***
tabele.
Niemniej jednak pytanie, gdzie przechowywać specyfikację, najprawdopodobniej będzie najważniejszym czynnikiem przy podejmowaniu decyzji, której użyć.
Wniosek
Zachęcamy do zdefiniowania informacji o schemacie dla wszystkich plików tekstowych zawierających daty lub kwoty walut. Daty i kwoty walut są wrażliwe na ustawienia regionalne, które mogą zakłócać prawidłowe analizowanie danych. Ponieważ mamy do czynienia z dwoma różnymi systemami z różnym dostępnym zestawem opcji, każdy z nich musimy rozważyć w kolejnych artykułach. Masz wybór, aby użyć jednego (lub nawet obu spośród różnych plików tekstowych). Przejdziemy teraz do schema.ini
w następnym artykule. Później przyjrzymy się MSysIMEX***
tabele w następnym artykule.