sql >> Database >  >> RDS >> Access

Verbindingsreeksparameters voor tekstbestandsbronnen

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:

  1. Is het een begrensde of een vaste breedte?
  2. Hoe weten we wanneer de ene kolom eindigt en de andere begint?
  3. Wordt tekst geciteerd of niet?
  4. Hoe moeten we datums en tijden ontleden?
  5. 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:

  1. Een schema.ini bestand opgeslagen in een map
  2. Toegang tot' MSysIMEX en MSysIMEXColumns tafels
  3. 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:

  1. We hebben het tekstbestand niet gespecificeerd in onze verbindingsreeks. We gebruikten in plaats daarvan een map.
  2. De namen van "tabellen" zijn gewijzigd omdat een punt in de naam geen geldig teken is. Ergo, products.csv werd products#csv .
  3. 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:

  1. 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'.
  2. 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.


  1. ORA-01950:geen privileges op tablespace 'USERS'

  2. Partitieonderhoud verbeteren met incrementele statistieken

  3. Tabelgegevens exporteren van de ene SQL Server naar de andere

  4. Geavanceerde SQL:CROSS APPLY en OUTER APPLY