sql >> Database teknologi >  >> RDS >> Access

Forbindelsesstrengparametre for tekstfilkilder

Forbindelsesstrengparametre for tekstfilkilder

I den forrige artikel dækkede jeg forbindelsesstrengparametrene for Excel-datakilder. Vi vil nu fokusere på tekstfilerne. Der er forskellige metoder til at beskrive tekstfilers skema og bruge oplysningerne under åbning eller linkning i Access. Selvom Excel-regneark havde en vis lighed med strukturen, er dette ikke sandt for tekstfilerne. Vi skal besvare flere spørgsmål om strukturen af ​​en tekstfil, herunder:

  1. Er det afgrænset eller fast bredde?
  2. Hvordan kan vi se, hvornår en kolonne slutter, og en anden starter?
  3. Er tekst citeret eller ej?
  4. Hvordan skal vi analysere datoer og tidspunkter?
  5. Hvad med valutabeløbene? Hvordan skal de formateres?

og muligvis mere. Selvom CSV umiddelbart ser ud til at være veldefineret, men når du graver i det, er det faktisk meget løst defineret. Der er ingen universel enighed om, hvorvidt tekst skal citeres, hvordan datoerne skal formateres. Af alle disse grunde kræver brug af tekstfiler normalt brug af en form for skemainformation til at beskrive strukturen af ​​tekstfilen. Der er tre måder at gemme skemaoplysninger på:

  1. Et schema.ini fil gemt i en mappe
  2. Adgang til MSysIMEX og MSysIMEXColumns tabeller
  3. Adgang' ImportExportSpecification.XML ejendom.

For at komplicere sagerne er der flere forskellige metoder, vi kan bruge til at arbejde med tekstfiler, men ikke alle metoder kan bruge alle de 3 forskellige måder at få skemaoplysningerne på. For eksempel DoCmd.TransferText fungerer med systemtabellerne, men ikke gemte importer/eksporter. På den anden side, DoCmd.RunSavedImportExport fungerer med ImportExportSpecification objekt. Men ImportExportSpecification bruges ikke som en del af linkningen. Så til vores diskussion har vi faktisk kun 2 metoder tilgængelige i forbindelse med at åbne eller linke til en tekstfil. Det er vigtigt at bemærke forskellen mellem at gemme en specifikation i MSysIMEXSpecs &MSysIMEXColumns tabeller i forhold til at gemme en import/eksport, som bliver en ImportExportSpecification objekt. Vi vil udforske disse 2 metoder i de næste artikler.

Forbindelsesstreng for tekstfil

Vi bør overveje, hvordan Access vil opfatte en tekstfil. I den forrige artikel så vi, at hvert ark eller et navngivet område var repræsenteret som en "tabel" i et Excel-regneark "database". Men en tekstfil har ikke en sådan konstruktion. Hvad gør en "database" så? Svaret er, at mappen repræsenterer en "database", og derfor er alle tekstfiler i en mappe "tabeller". Af den grund er det muligt at have flere skemaoplysninger for samme mappe, hvis den mappe indeholder mere end ét muligt format for tekstfiler, der er gemt i mappen. Du vil senere se, at når vi konstruerer forbindelsesstrengen, linker vi til mappen og får derefter adgang til den enkelte fil som en tabel.

Brug derfor denne opsætning som vist:

Vi kan derefter åbne en tekstfil ved hjælp af denne VBA-kode:

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

Dette skulle give output:

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

Vær opmærksom på følgende ting:

  1. Vi har ikke angivet tekstfilen i vores forbindelsesstreng. Vi brugte mappe i stedet.
  2. Navnene på "tabeller" blev ændret, fordi en prik i navnet ikke er et gyldigt tegn. Ergo, products.csv blev products#csv .
  3. Sammenlignet med Excel er der ingen obligatoriske parametre ud over at angive tekstfildriveren og stien til mappen.

I den næste artikel vil du lære mere om beskrivelsen af ​​skemaet for en tekstfil. Men for selve forbindelsesstrengen genkendes følgende nøgleord.

FMT parameter:Angiv formatet på tekstfilen.

Delimited :Filen er afgrænset af et tegn. Det anvendte tegn er specificeret af skemaoplysningerne.
Fixed :Filen har fast bredde for kolonne(r). Igen er den eller de specifikke kolonnebredder specificeret af skemaoplysningerne.

HDR parameter:Overskriftsrække

YES :Den første række er overskriften og skal blive kolonnenavnene for "tabellen"/"rekordsættet"
NO :Den første række behandles ikke anderledes og er kun en data. Alle kolonnenavne vil blive navngivet "FN", hvor "N" er et tal, der starter med 1

IMEX parameter:Import/eksportadfærd

Dette styrer, hvordan kolonnedatatyperne skal defineres, baseret på indholdet:
1 :Hvis kolonnen indeholder forskellige datatyper, skal du behandle den som en streng. Ellers skal du matche kolonnen med den bedste datatype.
2 :Tilpas altid kolonnen til en bestemt datatype baseret på prøven. Det kan forårsage en læsningsfejl, når vi læser en række, der indeholder data, der ikke matcher den forventede datatype.

ACCDB parameter:Indikerer, at Access bruger ACCDB-filformat?

Som standard er dette altid sat ACCDB=YES i et accdb filformat. Men at udelade det eller sætte det til NO ser ud til at gøre ingenting. Det er lidt af et mysterium. Hvis nogen kan dele, hvilken effekt denne parameter har, så skriv en kommentar, så opdaterer jeg bloggen.

DATABASE parameter:Sti til mappen, der indeholder tekstfilerne

Parameteren skal indeholde en fuldt kvalificeret sti. Det bør ikke indeholde tekstfilernes navne.

CharacterSet Parameter:Identificerer den tegnkodning, der skal bruges til at læse tekstfilerne.

Dette vil blive diskuteret mere detaljeret i næste artikel. Dette kan også beskrives i skemaoplysningerne.

DSN Parameter:Identificerer skemaoplysningerne, der skal bruges sammen med tekstfilen.

Navnet skal svare til MSysIMEXSpec , som vil blive analyseret i senere artikel. Dette virker kun med MSysIMEX*** tabeller. Hvis du ønsker at bruge schema.ini , du inkluderer simpelthen ikke nogen DSN i dine forbindelsesstrenge.

Det er vigtigt at bemærke, at tekstfildriveren kun vil tage hensyn til parametrene nævnt ovenfor. Det er ikke muligt at indsætte andre nøgleord og få det parset af tekstfildriveren. Af den grund vil du ikke være i stand til at angive alle detaljer om en tekstfil fra forbindelsesstrengen alene.

Standardskema for tekstfiler

I teorien kan du åbne eller linke en tekstfil uden nogen skemaoplysninger, men det vil sjældent virke. I denne situation vil Access blot antage standardindstillingerne for forskellige muligheder. Hvis tekstfilen er i overensstemmelse med alle de nuværende standardindstillinger, vil det lykkes Access at læse filen. Endnu vigtigere, fravær af fejl i at åbne eller linke til tekstfilen betyder ikke, at dataene er repræsenteret meningsfuldt. For eksempel kan særligt formaterede valutabeløb fortolkes som tekst i stedet for valuta, og ikke-separeret tekst med kommaer i teksten kan blive mistolket, hvilket tilføjer uønskede kolonner. Standardindstillingerne bestemmes to mulige steder:

  1. Adgang vil se på indstillingerne i registreringsdatabasen. Til Office 365-installation kan registreringsdatabasen findes på:
    Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Text . Vi vil referere til denne placering som "Tekstregistreringsnøgler" i de næste artikler.
  2. De indstillinger, du vil se i Region applet i Windows' kontrolpanel. Vi vil referere til denne placering som "Windows-indstillinger".

Bemærkning om kodning for tekstfilerne

Det er obligatorisk at have den korrekte kodning, uanset hvilke metoder du kan bruge til at få adgang til dine tekstfiler. Når din tekstfils indhold er begrænset til kun tegn inden for den nederste halvdel af ASCII-punkterne (f.eks. 0-127), er det næsten ligegyldigt, hvilken kodning du vælger til dine tekstfiler. Standarden er normalt god nok. Men hvis dine tekstfiler kan indeholde enhver Unicode eller tegn på mere end 127, er det op til dig, udvikleren, at kende kodningen. Hvis forkert kodning er angivet, importerer teksten muligvis ikke som forventet og vil ikke give nogen fejl. For rodede detaljer vil jeg henvise dig til Joel Spolsky om denne sag.

Vælg mellem schema.ini og MSysIMEX*** tabeller

Som du vil se i de næste artikler, har begge metoder et ret stort overlap i mulighederne. Derfor kan du finde dig selv at vælge at bruge enten. Den største forskel bunder i, om du ønsker, at skemaet skal gemmes i din applikation eller i en mappe, hvor tekstfiler forventes at være. Når du bruger schema.ini fil, antager du, at tekstfilerne vil være til stede i en bestemt mappe og vil have et bestemt navn.

Med MSysIMEX*** , kan du behandle alle tekstfiler hvor som helst ved blot at henvise til den definerede specifikation. Det er dog ikke let at redigere specifikationen uden for Access. Selv inden for Access er det ikke let at tilpasse specifikationer ved hjælp af brugergrænsefladen. schema.ini har nogle ekstra funktioner, der ikke er direkte tilgængelige med MSysIMEX*** tabeller.

Ikke desto mindre vil spørgsmålet om, hvor specifikationen skal opbevares, højst sandsynligt være din vigtigste faktor for at beslutte, hvilken du skal bruge.

Konklusion

Du opfordres kraftigt til at få defineret skemaoplysninger for tekstfiler, der indeholder datoer eller valutabeløb. Datoerne og valutabeløbene er følsomme over for regionale indstillinger, hvilket kan forstyrre korrekt parsing af dataene. Fordi vi har to forskellige systemer med forskellige tilgængelige sæt muligheder, skal vi overveje hver i de næste artikler. Du har valget mellem at bruge enten (eller endda begge dele blandt forskellige tekstfiler). Vi vil nu gå til schema.ini i næste artikel. Vi vil senere se på MSysIMEX*** tabeller i den følgende artikel.


  1. Er det muligt at tvinge rækkeniveaulåsning i SQL Server?

  2. ORA-01882:tidszoneregion blev ikke fundet

  3. Opret en standard offentlig profil til databasemail i SQL Server (T-SQL)

  4. Lyt til Microsoft Access Podcast Episode 1