Параметри на низ за връзка за източници на текстови файлове
В предишната статия разгледах параметрите на низ за свързване за източници на данни в Excel. Сега ще се съсредоточим върху текстовите файлове. Има различни методи за описание на схемата на текстови файлове и използване на информацията по време на отваряне или свързване в Access. Докато електронните таблици на Excel имаха известна прилика по структура, това не важи за текстовите файлове. Трябва да отговорим на няколко въпроса относно структурата на текстов файл, включително:
- Ограничена ли е или фиксирана ширина?
- Как да разберем кога една колона завършва и друга започва?
- Текстът цитиран ли е или не?
- Как трябва да анализираме датите и часовете?
- Какво ще кажете за валутните суми? Как трябва да бъдат форматирани?
а вероятно и повече. Въпреки че CSV може да изглежда добре дефиниран на пръв поглед, но когато се задълбочите в него, всъщност е много слабо дефиниран. Няма универсално съгласие относно това дали текстът трябва да се цитира, как трябва да се форматират датите. Поради всички тези причини използването на текстови файлове обикновено изисква използване на някаква информация за схемата, за да се опише структурата на текстовия файл. Има три начина за съхраняване на информация за схемата:
- А
schema.ini
файл, съхранен в директория - Достъп до
MSysIMEX
иMSysIMEXColumns
таблици - Достъп до
ImportExportSpecification.XML
собственост.
За да усложним нещата, има няколко различни метода, които можем да използваме за работа с текстови файлове, но не всички методи могат да използват всичките 3 различни начина за получаване на информация за схемата. Например DoCmd.TransferText
работи със системните таблици, но не е запазен импорт/експорт. От друга страна, DoCmd.RunSavedImportExport
работи с ImportExportSpecification
обект. Въпреки това, ImportExportSpecification
не се използва като част от свързването. Така че за нашата дискусия всъщност имаме само 2 налични метода в контекста на отваряне или свързване към текстов файл. Важно е да се отбележи разликата между запазването на спецификация в MSysIMEXSpecs
&MSysIMEXColumns
таблици спрямо запазване на импортиране/експортиране, което става ImportExportSpecification
обект. Ще разгледаме тези 2 метода в следващите статии.
Низ за връзка за текстов файл
Трябва да помислим как Access ще възприеме текстов файл. В предишната статия видяхме, че всеки лист или именуван диапазон е представен като „таблица“ в „база данни“ на електронна таблица на Excel. Но текстовият файл няма такава конструкция. Какво прави тогава „база данни“? Отговорът е, че папката представлява „база данни“ и следователно всички текстови файлове в папка са „таблици“. Поради тази причина е възможно да имате информация за множество схеми за една и съща папка, ако тази папка съдържа повече от един възможен формат за всякакви текстови файлове, съхранявани в папката. По-късно ще видите, че когато конструираме низа за връзка, ние правим връзка към папката, след което осъществяваме достъп до отделния файл като таблица.
Следователно, използвайте тази настройка, както е показано:
След това можем да отворим текстов файл, използвайки този 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
Това трябва да даде резултат:
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
Обърнете внимание на следните неща:
- Не сме посочили текстовия файл в нашия низ за връзка. Вместо това използвахме папка.
- Имената на „таблици“ бяха променени, тъй като точката в името не е валиден знак. Следователно,
products.csv
станаproducts#csv
. - В сравнение с Excel, няма задължителни параметри освен определянето на драйвера на текстовия файл и пътя до папката.
В следващата статия ще научите повече за описването на схемата на текстови файлове. За самия низ за връзка обаче се разпознават следните ключови думи.
FMT
параметър:Посочва формата на текстовия файл.
Delimited
:Файлът е разделен със знак. Използваният символ се определя от информацията за схемата.
Fixed
:Файлът има фиксирана ширина за колона(и). Отново, конкретната ширина(и) на колони се определят от информацията за схемата.
HDR
параметър:Заглавен ред
YES
:Първият ред е заглавието и трябва да стане имената на колоните за „таблицата“/“наборът от записи“
NO
:Първият ред не се третира по различен начин и е просто данни. Всички имена на колони ще бъдат наречени „FN“, където „N“ е число, започващо с 1
IMEX
параметър:Import/Export Behavior
Това урежда как трябва да се дефинират типовете данни в колоните въз основа на съдържанието:
1
:Ако колоната съдържа различни типове данни, третирайте я като низ. В противен случай съпоставете колоната с най-добрия тип данни.
2
:Винаги съпоставяйте колоната с определен тип данни въз основа на извадката. Това може да причини грешка при четенето, когато четем ред, който съдържа данни, които не съответстват на очаквания тип данни.
ACCDB
параметър:Показва, че Access използва файлов формат ACCDB?
По подразбиране това винаги е зададено ACCDB=YES във файлов формат accdb. Въпреки това, пропускането или задаването му на НЕ изглежда не прави нищо. Това е малко мистерия. Ако някой може да сподели какъв ефект има този параметър, публикувайте в коментар и аз ще актуализирам блога.
DATABASE
параметър:Път до папката, която съдържа текстовите файлове
Параметърът трябва да съдържа напълно квалифициран път. Не трябва да включва имената на текстовите файлове.
CharacterSet
Параметър:Идентифицира кодирането на знаци, което да се използва за четене на текстовите файлове.
Това ще бъде обсъдено по-подробно в следващата статия. Това също може да бъде описано в информацията за схемата.
DSN
Параметър:Идентифицира информацията за схемата, която да се използва с текстовия файл.
Името трябва да съответства на MSysIMEXSpec
, който ще бъде анализиран в следващата статия. Това работи само с MSysIMEX***
маси. Ако искате да използвате schema.ini
, просто не включвате никакъв DSN
във вашите низове за връзка.
Важно е да се отбележи, че драйверът за текстов файл ще вземе предвид само параметрите, изброени по-горе. Не е възможно да се поставят други ключови думи и те да бъдат анализирани от драйвера на текстовия файл. Поради тази причина няма да можете да посочите всички подробности за текстов файл само от низа за връзка.
Схема по подразбиране за текстови файлове
На теория можете да отворите или свържете текстов файл без никаква информация за схемата, но това рядко ще работи. В тази ситуация Access просто ще приеме настройките по подразбиране за различни опции. Ако текстовият файл отговаря на всички текущи настройки по подразбиране, Access ще успее да прочете файла. По-важното е, че липсата на грешки при отваряне или свързване към текстовия файл не означава, че данните са представени смислено. Например, специално форматирани суми във валута могат да бъдат интерпретирани като текст, а не като валута, а текстът без граници със запетаи в текста може да бъде неправилно анализиран, добавяйки нежелани колони. Настройките по подразбиране се определят на две възможни места:
- Достъпът ще прегледа настройките на системния регистър. За инсталиране на Office 365, регистърът може да се намира на адрес:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Text
. Ще наричаме това местоположение „Текстови ключове в системния регистър“ в следващите статии. - Настройките, които ще видите в
Region
аплет в контролния панел на Windows. Ще наричаме това местоположение „Настройки на Windows“.
Забележка относно кодирането на текстовите файлове
Задължително е да имате правилното кодиране, независимо кои методи можете да използвате за достъп до вашите текстови файлове. Когато съдържанието на вашия текстов файл е ограничено само до знаци в долната половина на ASCII точките (например 0-127), едва ли има значение какво кодиране ще изберете за вашите текстови файлове. По подразбиране обикновено е достатъчно добро. Въпреки това, ако вашите текстови файлове могат да съдържат Unicode или всякакви знаци, по-големи от 127, тогава вие, разработчикът, трябва да знаете кодирането. Ако е посочено грешно кодиране, текстът може да не се импортира според очакванията и няма да изведе грешки. За разхвърляни подробности ще ви насоча към Джоел Сполски по този въпрос.
Избиране между schema.ini
и MSysIMEX***
таблици
Както ще видите в следващите статии, и двата метода имат доста голямо припокриване във възможностите. Следователно може да откриете, че имате избор да използвате едно от двете. Основната разлика се свежда до това дали искате схемата да се съхранява във вашето приложение или в папка, където се очаква да бъдат текстови файлове. Когато използвате schema.ini
файл, вие предполагате, че текстовите файлове ще присъстват в определена папка и ще имат определено име.
С MSysIMEX***
, можете да обработвате всякакви текстови файлове отвсякъде, просто като се позовавате на дефинираната спецификация. Въпреки това, не е лесно да редактирате спецификацията извън Access. Дори в рамките на Access не е лесно да настроите спецификациите с помощта на потребителски интерфейс. schema.ini
има някои допълнителни функции, които не са директно достъпни с MSysIMEX***
таблици.
Независимо от това, въпросът къде да съхранявате спецификацията най-вероятно ще бъде най-важният ви фактор при вземането на решение кое да използвате.
Заключение
Силно препоръчваме да дефинирате информация за схемата за всички текстови файлове, които съдържат дати или валутни суми. Датите и валутните суми са чувствителни към регионалните настройки, което може да попречи на правилния анализ на данните. Тъй като имаме две различни системи с различен наличен набор от опции, трябва да разгледаме всяка в следващите статии. Имате избор да използвате едното (или дори и двете между различни текстови файлове). Сега ще се обърнем към schema.ini
в следващата статия. По-късно ще разгледаме MSysIMEX***
таблици в следващата статия.