Anslutningssträngsparametrar för textfilkällor
I den tidigare artikeln täckte jag anslutningssträngparametrarna för Excel-datakällor. Vi kommer nu att fokusera på textfilerna. Det finns olika metoder för att beskriva textfilers schema och använda informationen under öppning eller länkning i Access. Även om Excel-kalkylblad hade en viss likhet i strukturen, är detta inte sant för textfilerna. Vi måste svara på flera frågor om strukturen för en textfil inklusive:
- Är den avgränsad eller fast bredd?
- Hur vet vi när en kolumn slutar och en annan börjar?
- Är text citerad eller inte?
- Hur ska vi analysera datum och tider?
- Vad sägs om valutabeloppen? Hur ska de formateras?
och möjligen mer. Även om CSV kan tyckas vara väldefinierat vid en anblick, men när du gräver i det är det faktiskt väldigt löst definierat. Det finns ingen allmän överenskommelse om huruvida text ska citeras, hur datumen ska formateras. Av alla dessa skäl kräver användning av textfiler vanligtvis användning av någon form av schemainformation för att beskriva textfilens struktur. Det finns tre sätt att lagra schemainformation:
- Ett
schema.ini
fil lagrad i en katalog - Åtkomst till
MSysIMEX
ochMSysIMEXColumns
tabeller - Åtkomst till
ImportExportSpecification.XML
egendom.
För att komplicera saken finns det flera olika metoder vi kan använda för att arbeta med textfiler, men alla metoder kan inte använda alla de tre olika sätten att få schemainformationen. Till exempel DoCmd.TransferText
fungerar med systemtabellerna men inte sparade importer/exporter. Å andra sidan, DoCmd.RunSavedImportExport
fungerar med ImportExportSpecification
objekt. Men ImportExportSpecification
används inte som en del av länkningen. Så för vår diskussion har vi faktiskt bara 2 metoder tillgängliga i samband med att öppna eller länka till en textfil. Det är viktigt att notera skillnaden mellan att spara en specifikation i MSysIMEXSpecs
&MSysIMEXColumns
tabeller kontra att spara en import/export som blir en ImportExportSpecification
objekt. Vi kommer att utforska dessa två metoder i nästa artiklar.
Anslutningssträng för textfil
Vi bör överväga hur Access kommer att uppfatta en textfil. I den föregående artikeln såg vi att varje ark eller ett namngivet intervall representerades som en "tabell" i ett Excel-kalkylblad "databas". Men en textfil har ingen sådan konstruktion. Vad gör en "databas" då? Svaret är att mappen representerar en "databas" och därför är alla textfiler i en mapp "tabeller". Av den anledningen är det möjligt att ha flera schemainformation för samma mapp om den mappen innehåller mer än ett möjligt format för alla textfiler som lagras i mappen. Du kommer att se senare att när vi konstruerar anslutningssträngen, länkar vi till mappen och kommer sedan åt den individuella filen som en tabell.
Använd därför denna inställning enligt bilden:
Vi kan sedan öppna en textfil med denna VBA-kod:
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
Detta bör ge resultatet:
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
Lägg märke till följande saker:
- Vi har inte angett textfilen i vår anslutningssträng. Vi använde mappen istället.
- Namnen på "tabeller" har ändrats eftersom en punkt i namnet inte är ett giltigt tecken. Alltså
products.csv
blevproducts#csv
. - Jämfört med Excel finns det inga obligatoriska parametrar utöver att specificera textfilens drivrutin och sökvägen till mappen.
I nästa artikel kommer du att lära dig mer om att beskriva schemat för en textfil. Men för själva anslutningssträngen känns följande nyckelord igen.
FMT
parameter:Ange formatet på textfilen.
Delimited
:Filen är avgränsad med ett tecken. Det tecken som används anges av schemainformationen.
Fixed
:Filen har fast bredd för kolumner. Återigen specificeras den eller de specifika kolumnbredderna av schemainformationen.
HDR
parameter:Rubrikrad
YES
:Den första raden är rubriken och ska bli kolumnnamnen för "tabellen"/"recordset"
NO
:Den första raden behandlas inte annorlunda och är bara en data. Alla kolumnnamn kommer att heta "FN" där "N" är ett tal som börjar med 1
IMEX
parameter:Import/Export Beteende
Detta styr hur kolumndatatyperna ska definieras, baserat på innehållet:
1
:Om kolumnen innehåller olika datatyper, behandla den som en sträng. Annars matchar du kolumnen med den bästa datatypen.
2
:Matcha alltid kolumnen med en viss datatyp baserat på provet. Det kan orsaka ett läsfel när vi läser en rad som innehåller data som inte matchar den förväntade datatypen.
ACCDB
parameter:Indikerar att Access använder filformatet ACCDB?
Som standard är detta alltid inställt ACCDB=YES i ett accdb-filformat. Men att utelämna den eller ställa den till NO verkar inte göra någonting. Det är lite av ett mysterium. Om någon kan dela vilken effekt denna parameter har, skriv en kommentar så uppdaterar jag bloggen.
DATABASE
parameter:Sökväg till mappen som innehåller textfilerna
Parametern bör innehålla en fullständigt kvalificerad sökväg. Det bör inte innehålla textfilernas namn.
CharacterSet
Parameter:Identifierar teckenkodningen som ska användas för att läsa textfilerna.
Detta kommer att diskuteras mer detaljerat i nästa artikel. Detta kan också beskrivas i schemainformationen.
DSN
Parameter:Identifierar schemainformationen som ska användas med textfilen.
Namnet måste motsvara MSysIMEXSpec
, som kommer att analyseras i senare artikel. Detta fungerar bara med MSysIMEX***
tabeller. Om du vill använda schema.ini
, du inkluderar helt enkelt inte någon DSN
i dina anslutningssträngar.
Det är viktigt att notera att textfilsdrivrutinen endast tar hänsyn till parametrarna som anges ovan. Det är inte möjligt att lägga in andra nyckelord och få det att tolkas av textfilens drivrutin. Av den anledningen kommer du inte att kunna ange alla detaljer om en textfil från enbart anslutningssträngen.
Standardschema för textfiler
I teorin kan du öppna eller länka en textfil utan någon schemainformation men det kommer sällan att fungera. I den här situationen kommer Access helt enkelt att anta standardinställningarna för olika alternativ. Om textfilen överensstämmer med alla nuvarande standardinställningar kommer Access att lyckas läsa filen. Ännu viktigare, frånvaron av fel i att öppna eller länka till textfilen betyder inte att data representeras meningsfullt. Till exempel kan specialformaterade valutabelopp tolkas som text snarare än valuta, och icke-avgränsad text med kommatecken i texten kan misstolkas och lägga till oönskade kolumner. Standardinställningarna bestäms på två möjliga ställen:
- Åtkomst kommer att titta på registerinställningarna. För installation av Office 365 kan registret finnas på:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Text
. Vi kommer att hänvisa till den här platsen som "Textregisternycklar" i nästa artiklar. - Inställningarna du skulle se i
Region
applet i Windows kontrollpanel. Vi kommer att referera till den här platsen som "Windows-inställningar".
Anmärkning om kodning för textfilerna
Det är obligatoriskt att ha rätt kodning oavsett vilka metoder du kan använda för att komma åt dina textfiler. När din textfils innehåll är begränsat till endast tecken inom den nedre hälften av ASCII-punkterna (t.ex. 0-127), spelar det knappast någon roll vilken kodning du väljer för dina textfiler. Standarden är vanligtvis tillräckligt bra. Men om dina textfiler kan innehålla vilken Unicode som helst eller tecken som är större än 127, är det upp till dig, utvecklaren, att känna till kodningen. Om fel kodning anges kan det hända att texten inte importeras som förväntat och kommer inte att ge några fel. För röriga detaljer hänvisar jag dig till Joel Spolsky i denna fråga.
Välja mellan schema.ini
och MSysIMEX***
tabeller
Som du kommer att se i nästa artiklar har båda metoderna en ganska stor överlappning i kapaciteten. Därför kan du hitta dig själv att välja mellan att använda antingen. Den största skillnaden handlar om om du vill att schemat ska lagras i din applikation eller i en mapp där textfiler förväntas finnas. När du använder schema.ini
fil, antar du att textfilerna kommer att finnas i en viss mapp och kommer att ha ett visst namn.
Med MSysIMEX***
, kan du bearbeta alla textfiler var som helst helt enkelt genom att referera till den definierade specifikationen. Det är dock inte lätt att redigera specifikationen utanför Access. Även inom Access är det inte lätt att justera specifikationer med UI. schema.ini
har några ytterligare funktioner som inte är direkt tillgängliga med MSysIMEX***
tabeller.
Frågan om var specifikationen ska lagras kommer dock med största sannolikhet att vara din viktigaste faktor för att bestämma vilken du ska använda.
Slutsats
Du uppmuntras starkt att ha schemainformation definierad för alla textfiler som innehåller datum eller valutabelopp. Datum och valutabelopp är känsliga för regionala inställningar, vilket kan störa korrekt analys av data. Eftersom vi har två olika system med olika tillgängliga alternativ måste vi överväga vart och ett i nästa artiklar. Du kan välja att använda antingen (eller till och med båda bland olika textfiler). Vi kommer nu att gå till schema.ini
i nästa artikel. Vi kommer senare att titta på MSysIMEX***
tabeller i följande artikel.