schema.ini文件不适用于MS Access

时间:2015-08-25 16:54:46

标签: vba ms-access access-vba schema

我有一堆csv文件,我通过VBA导入Access中的表。我还有一个schema.ini文件与我导入的csv文件位于同一目录中。尽管字段在ini文件中被指定为double类型,但它们在Access中变为文本类型字段。每次在顶部的字段中存在大量空值时,就会发生这种情况。如果我在前10或20个字段中至少有一个非空值,则该字段将变为数字类型。

经过一些研究后,我的评估是schema.ini文件没有做任何事情,Access正在确定字段的数据类型,因为我看到的行为正是Access的默认行为(如果是模式)。不使用ini文件。)

所以这让我相信我的schema.ini文件有问题。

以下是我正在导入的5个csv文件中的3个我的schema.ini文件的示例:

[ForClsDatedModel_2015 0702_1004-1254.csv]
ColNameHeader=True
Format=CSVDelimited
"Ticker"=TEXT
"WT Def BSS MF-WT"=INTEGER
"Cyc BSS MF-WT"=DOUBLE
"WT Cyc BSS MF-WT"=INTEGER
"Gr BSS MF-WT"=DOUBLE
"WT Gr BSS MF-WT"=DOUBLE
"NT BSS MF-WT"=DOUBLE
"WT NT BSS MF-WT"=INTEGER
"WT BSS (All Ts)"=DOUBLE
"No Cust Ind BSS MF-WI"=DOUBLE
"WI No Cust Ind BSS MF-WI"=DOUBLE
"BSS MF-AE"=DOUBLE
"BSS MF-AE Score"=DOUBLE
"Cross BSS"=DOUBLE
"Cross BSS Score"=DOUBLE

...etc....

"Avg Qtrly NIM"=DOUBLE
"Avg Qtrly PROFITS TO TOTAL LOANS"=DOUBLE
"yoy -0 PROFITS TO LL RESERVE GROWTH"=DOUBLE
"yoy -1 PROFITS TO LL RESERVE GROWTH"=DOUBLE
"yoy -2 PROFITS TO LL RESERVE GROWTH"=DOUBLE
"yoy -3 PROFITS TO LL RESERVE GROWTH"=DOUBLE
"Ann PROFITS TO LL RESERVE GROWTH"=DOUBLE
"Avg Qtrly PROFITS TO LL RESERVE Gr"=DOUBLE
"PROFITS TO LL RESERVE Gr"=DOUBLE
"WT PROFITS TO LL RESERVE Gr"=INTEGER
"WI PROFITS TO LL RESERVE Gr"=INTEGER
"WG PROFITS TO LL RESERVE Gr"=INTEGER
"Rk PROFITS TO LL RESERVE Gr"=INTEGER
[ForClsDatedModel_2015 0702_1-250.csv]
ColNameHeader=True
Format=CSVDelimited
"Ticker"=TEXT
"Fundamental Ticker"=TEXT
"Name"=TEXT
"Custom Industry"=TEXT
"Crescat Industry"=TEXT
"GICS Sector"=TEXT
"GICS Industry Group"=TEXT
"GICS Industry"=TEXT
"GICS Sub-Industry"=TEXT
"Russell Sector"=TEXT
"Currency Being Used"=TEXT
"Report CCY"=TEXT
"Market Status"=TEXT
"IU"=INTEGER
"GM"=INTEGER
"L_fs_S"=DOUBLE
"Or"=INTEGER
"LC"=DOUBLE
"JM"=DOUBLE
"Side"=DOUBLE
"Holding"=DOUBLE
"Theme"=INTEGER

...etc....

"1M Proj Adj Return"=DOUBLE
"Rk 1M Proj Adj Return"=DOUBLE
"3M Proj Adj Return"=DOUBLE
"Rk 3M Proj Adj Return"=DOUBLE
"6M Proj Adj Return"=DOUBLE
"Rk 6M Proj Adj Return"=DOUBLE
"1Y Proj Adj Return"=INTEGER
"Rk 1Y Proj Adj Return"=DOUBLE
"non-neg PE4QT"=DOUBLE
"non-neg PE4QF"=DOUBLE
"non-neg PCFO4QT"=DOUBLE
[ForClsDatedModel_2015 0702_1255-1505.csv]
ColNameHeader=True
Format=CSVDelimited
"Ticker"=TEXT
"WI EP MF-WI"=INTEGER
"WI MF-WI (All Ts)"=INTEGER
"Beta (10 yr or 5 yr)"=DOUBLE
"Rk Beta (10 yr or 5 yr)"=DOUBLE
"Vol30"=DOUBLE
"Rk Vol30"=DOUBLE
"Vol90"=DOUBLE
"Rk Vol90"=DOUBLE

...etc...

schema.ini文件有什么问题?谢谢!

2 个答案:

答案 0 :(得分:3)

基本上有两种方法可以将文本文件(.txt,.csv,.tab)的数据列预先设置为Access数据库,这两种方法都使用不同的VBA方法。

<强> 1。规格对象(保存在数据库中)

在这里,您使用DoCmd.TransferText,其中一个参数是可选的规范名称(没有扩展名或路径)。

DoCmd.TransferText(TransferType, SpecificationName, TableName, FileName, 
                    HasFieldNames, HTMLTableName, CodePage)

要创建此规范对象,您需要手动导入一个示例文本文件,遍历向导,在最后一部分完成之前,单击高级按钮,该按钮汇总您刚刚指定的所有项目 - 字段名称,长度通过单击对话框窗口中的“另存为”来保存整个摘要文件并记住您给出的名称,这是上面的规范参数。

事实上,一旦保存了规格,您就可以完全取消向导。导入/导出规范存储在可查询的Access系统表MSysIMEXSpecs中,并且可以在.accdb文件的生命周期内使用和重用,甚至可以重写(通过向导再次)。实际上,您甚至可以导入其他数据库(在“外部数据”向导中单击“高级”)。

<强> 2。 Schema.ini文件(保存在数据库外部)

此处,文本文件表现为外部表,因为它包含可以链接到Access的架构,或者通过Microsoft.com上列出的记录集打开。现在需要一种解决方法,因为此外部文件不会使用导入方法自动执行。下面是链接表选项的修改,其中通过生成表查询(携带所有模式和结构和数据)创建本地表。之后,链接表被销毁(而不是表本身只是链接)。将其调整到您的应用程序中,可能是在按钮OnClick或表单OnOpen事件上,或通过AutoExec宏从VBA模块调用(当db首次打开时)。

Function LinkSchema() 
Dim db As DATABASE, tbl As TableDef 

Set db = CurrentDb() 
Set tbl = db.CreateTableDef("Linked Text")

tbl.Connect = "Text;DATABASE=c:\my documents;TABLE=csvFile_linked" 
tbl.SourceTableName = "csvFile.csv" 

db.TableDefs.Append tbl 
db.TableDefs.Refresh 

db.Execute "SELECT * INTO csvFile_local FROM csvFile_linked", dbFailOnError
db.TableDefs.Delete("csvFile_linked")

Set tbl = Nothing
Set db = Nothing

End Function

如上所述,我个人从不使用schema.ini文件,因为Microsoft支持不是最新的,它甚至可能是过时的遗留方法。规格提供了流动的灵活性,因为它们与导入/导出程序一起工作。此外,它们直接保存在数据库中,无需在外部进行管理。

答案 1 :(得分:0)

我认为你的字段规范语法是错误的 来自http://www.htmlgoodies.com/primers/database/work-with-text-file-data-using-the-microsoft-text-driver-creating-a-csv-data-file.html

  

逐行了解Schema.ini文件

     

第5行及以上:指定每个列的名称,数据类型,宽度if   适用。一般语法是

     

Col(n)=<column name> <data type> <Width width>

     

其中n是CSV文件中列的位置,Width是   仅限文本。

https://msdn.microsoft.com/en-us/library/ms709353%28VS.85%29.aspx

  

下一个条目使用列号指定表中的字段   (Coln)选项,对于字符分隔的文件是可选的   固定长度文件所需。

所以你可以像你一样省略Col1 =,Col2 =等,但是=属于Col(n)和列名,而不是名称和类型。所以用空格替换=。

此外,INTEGER可能不是导入Access的有效数据类型 - 请改用Short或Long。但我不确定。

编辑:我实际上没有使用过这个(或者如果我有,我忘了它),但是从我链接的引用中它应该看起来:

[ForClsDatedModel_2015 0702_1004-1254.csv]
ColNameHeader=True
Format=CSVDelimited
"Ticker" TEXT
"WT Def BSS MF-WT" LONG
"Cyc BSS MF-WT" DOUBLE

或者如果不起作用,请尝试包含Col n - 大多数示例都包含它们,即使它是CSVDelimited:

[ForClsDatedModel_2015 0702_1004-1254.csv]
ColNameHeader=True
Format=CSVDelimited
Col1="Ticker" TEXT
Col2="WT Def BSS MF-WT" LONG
Col3="Cyc BSS MF-WT" DOUBLE