Verbindingsreeksparameters voor tekstbestandsbronnen
In het vorige artikel heb ik de verbindingsreeksparameters voor Excel-gegevensbronnen behandeld. We zullen ons nu concentreren op de tekstbestanden. Er zijn verschillende methoden om het schema van tekstbestanden te beschrijven en de informatie te gebruiken tijdens het openen of koppelen in Access. Hoewel Excel-spreadsheets qua structuur enigszins op elkaar leken, geldt dit niet voor de tekstbestanden. We moeten verschillende vragen beantwoorden over de structuur van een tekstbestand, waaronder:
- Is het een begrensde of een vaste breedte?
- Hoe weten we wanneer de ene kolom eindigt en de andere begint?
- Wordt tekst geciteerd of niet?
- Hoe moeten we datums en tijden ontleden?
- Hoe zit het met de valutabedragen? Hoe moeten ze worden opgemaakt?
en mogelijk nog meer. Hoewel CSV op het eerste gezicht goed gedefinieerd lijkt, is het eigenlijk heel losjes gedefinieerd. Er is geen universele overeenstemming over de vraag of tekst moet worden geciteerd, hoe de datums moeten worden opgemaakt. Om al deze redenen vereist het gebruik van tekstbestanden meestal het gebruik van een soort schema-informatie om de structuur van het tekstbestand te beschrijven. Er zijn drie manieren om schema-informatie op te slaan:
- Een
schema.ini
bestand opgeslagen in een map - Toegang tot'
MSysIMEX
enMSysIMEXColumns
tafels - Toegang tot'
ImportExportSpecification.XML
eigendom.
Om de zaken nog ingewikkelder te maken, zijn er verschillende methoden die we kunnen gebruiken om met tekstbestanden te werken, maar niet alle methoden kunnen alle 3 verschillende manieren gebruiken om de schema-informatie te verkrijgen. Bijvoorbeeld DoCmd.TransferText
werkt met de systeemtabellen maar niet met opgeslagen import/export. Aan de andere kant, DoCmd.RunSavedImportExport
werkt met de ImportExportSpecification
voorwerp. Echter, de ImportExportSpecification
wordt niet gebruikt als onderdeel van de koppeling. Dus voor onze discussie hebben we eigenlijk maar 2 methoden beschikbaar in de context van het openen of linken naar een tekstbestand. Het is belangrijk om het onderscheid te maken tussen het opslaan van een specificatie in de MSysIMEXSpecs
&MSysIMEXColumns
tabellen versus het opslaan van een import/export die een ImportExportSpecification
wordt voorwerp. We zullen deze 2 methoden in de volgende artikelen onderzoeken.
Verbindingsreeks voor tekstbestand
We moeten overwegen hoe Access een tekstbestand zal waarnemen. In het vorige artikel zagen we dat elk blad of een benoemd bereik werd weergegeven als een "tabel" in een Excel-spreadsheet "database". Maar een tekstbestand heeft zo'n constructie niet. Wat maakt dan een "database"? Het antwoord is dat de map een "database" vertegenwoordigt en daarom zijn alle tekstbestanden in een map "tabellen". Om die reden is het mogelijk om meerdere schema-informatie voor dezelfde map te hebben als die map meer dan één mogelijke indeling bevat voor tekstbestanden die in de map zijn opgeslagen. U zult later zien dat wanneer we de verbindingsreeks maken, we naar de map linken en vervolgens het individuele bestand als een tabel openen.
Gebruik daarom deze opstelling zoals weergegeven:
We kunnen dan een tekstbestand openen met deze VBA-code:
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
Dit zou de output moeten opleveren:
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
Let op de volgende dingen:
- We hebben het tekstbestand niet gespecificeerd in onze verbindingsreeks. We gebruikten in plaats daarvan een map.
- De namen van "tabellen" zijn gewijzigd omdat een punt in de naam geen geldig teken is. Ergo,
products.csv
werdproducts#csv
. - Vergeleken met Excel zijn er geen andere verplichte parameters dan het specificeren van het stuurprogramma voor het tekstbestand en het pad naar de map.
In het volgende artikel leert u meer over het beschrijven van het schema van een tekstbestand. Voor de verbindingsreeks zelf worden echter de volgende trefwoorden herkend.
FMT
parameter:Geef het formaat van het tekstbestand aan.
Delimited
:Het bestand wordt begrensd door een teken. Het gebruikte teken wordt gespecificeerd door de schema-informatie.
Fixed
:Het bestand heeft een vaste breedte voor kolom(men). Nogmaals, de specifieke kolombreedte(n) worden gespecificeerd door de schema-informatie.
HDR
parameter:kopregel
YES
:De eerste rij is de kop en zouden de kolomnamen moeten worden voor de “tabel”/”recordset”
NO
:De eerste rij wordt niet anders behandeld en is slechts een gegevens. Alle kolomnamen krijgen de naam "FN" waarbij "N" een getal is dat begint met 1
IMEX
parameter:Import/Export Gedrag
Dit bepaalt hoe de kolomgegevenstypen moeten worden gedefinieerd, op basis van de inhoud:
1
:Als de kolom verschillende gegevenstypen bevat, behandel deze dan als een tekenreeks. Zoek anders de kolom naar het beste gegevenstype.
2
:stem de kolom altijd af op een bepaald gegevenstype op basis van het voorbeeld. Dat kan een leesfout veroorzaken wanneer we een rij lezen die gegevens bevat die niet overeenkomen met het verwachte gegevenstype.
ACCDB
parameter:geeft aan dat Access ACCDB-bestandsindeling gebruikt?
Standaard is dit altijd ACCDB=YES ingesteld in een accdb-bestandsformaat. Echter, weglaten of instellen op NEE lijkt niets te doen. Het is een beetje een mysterie. Als iemand kan delen welk effect deze parameter heeft, plaats dan een reactie en ik zal de blog bijwerken.
DATABASE
parameter:Pad naar de map die de tekstbestanden bevat
De parameter moet een volledig gekwalificeerd pad bevatten. Het mag niet de namen van de tekstbestanden bevatten.
CharacterSet
Parameter:Identificeert de tekencodering die moet worden gebruikt voor het lezen van de tekstbestanden.
Dit zal in het volgende artikel in meer detail worden besproken. Dit kan ook worden beschreven in de schema-informatie.
DSN
Parameter:Identificeert de schema-informatie die met het tekstbestand moet worden gebruikt.
De naam moet overeenkomen met de MSysIMEXSpec
, die in een later artikel zal worden geanalyseerd. Dit werkt alleen met de MSysIMEX***
tafels. Als u schema.ini
wilt gebruiken , je voegt gewoon geen DSN
toe in uw verbindingsreeksen.
Het is belangrijk op te merken dat het stuurprogramma voor tekstbestanden alleen rekening houdt met de hierboven genoemde parameters. Het is niet mogelijk om andere trefwoorden in te voeren en deze te laten parseren door de tekstbestandsdriver. Om die reden kunt u niet alle details over een tekstbestand uit de verbindingsreeks alleen specificeren.
Standaardschema voor tekstbestanden
In theorie kun je een tekstbestand openen of koppelen zonder enige schema-informatie, maar dit zal zelden werken. In deze situatie gaat Access gewoon uit van de standaardinstellingen voor verschillende opties. Als het tekstbestand voldoet aan alle huidige standaardinstellingen, zal Access het bestand kunnen lezen. Wat nog belangrijker is, de afwezigheid van fouten bij het openen van of linken naar het tekstbestand betekent niet dat de gegevens zinvol worden weergegeven. Zo kunnen bijvoorbeeld speciaal opgemaakte valutabedragen worden geïnterpreteerd als tekst in plaats van als valuta, en niet-gescheiden tekst met komma's in de tekst kan verkeerd worden geparseerd, waardoor ongewenste kolommen worden toegevoegd. De standaardwaarden worden op twee mogelijke plaatsen bepaald:
- Toegang zal kijken naar de registerinstellingen. Voor Office 365-installatie bevindt het register zich op:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Text
. In de volgende artikelen zullen we naar deze locatie verwijzen als 'Tekstregistersleutels'. - De instellingen die u zou zien in de
Region
applet in het configuratiescherm van Windows. We zullen naar deze locatie verwijzen als "Windows-instellingen".
Opmerking over codering voor de tekstbestanden
Het is verplicht om de juiste codering te hebben, ongeacht welke methoden u gebruikt om toegang te krijgen tot uw tekstbestanden. Wanneer de inhoud van uw tekstbestand beperkt is tot alleen tekens binnen de onderste helft van de ASCII-punten (bijv. 0-127), maakt het nauwelijks uit welke codering u kiest voor uw tekstbestanden. De standaard is meestal goed genoeg. Als uw tekstbestanden echter Unicode of tekens groter dan 127 kunnen bevatten, is het aan u, de ontwikkelaar, om de codering te kennen. Als verkeerde codering is opgegeven, wordt de tekst mogelijk niet geïmporteerd zoals verwacht en worden er geen fouten gegenereerd. Voor rommelige details verwijs ik je naar Joel Spolsky over deze kwestie.
Kiezen tussen schema.ini
en MSysIMEX***
tafels
Zoals je in de volgende artikelen zult zien, hebben beide methoden een vrij grote overlap in de mogelijkheden. Daarom kan het zijn dat u de keuze heeft om een van beide te gebruiken. Het belangrijkste verschil komt neer op het feit of u wilt dat het schema wordt opgeslagen in uw toepassing of in een map waar tekstbestanden worden verwacht. Wanneer u de schema.ini
. gebruikt bestand, gaat u ervan uit dat de tekstbestanden in een bepaalde map aanwezig zullen zijn en een bepaalde naam zullen hebben.
Met de MSysIMEX***
, kunt u alle tekstbestanden overal vandaan verwerken door simpelweg naar de gedefinieerde specificatie te verwijzen. Het is echter niet eenvoudig om de specificatie buiten Access te bewerken. Zelfs binnen Access is het niet eenvoudig om specificaties aan te passen met behulp van de gebruikersinterface. De schema.ini
heeft enkele extra functies die niet direct beschikbaar zijn met MSysIMEX***
tabellen.
Desalniettemin zal de vraag waar u de specificatie moet opslaan waarschijnlijk uw belangrijkste factor zijn bij de beslissing welke u wilt gebruiken.
Conclusie
We raden u ten zeerste aan om schema-informatie te definiëren voor alle tekstbestanden die datums of valutabedragen bevatten. De datums en valutabedragen zijn gevoelig voor regionale instellingen, wat de correcte ontleding van de gegevens kan verstoren. Omdat we twee verschillende systemen hebben met verschillende beschikbare opties, moeten we elk in de volgende artikelen beschouwen. Je hebt de keuze om een van beide te gebruiken (of zelfs beide tussen verschillende tekstbestanden). We gaan nu naar de schema.ini
in het volgende artikel. We zullen later kijken naar MSysIMEX***
tabellen in het volgende artikel.