Ms access 从文本导入未知字段顺序

Ms access 从文本导入未知字段顺序,ms-access,csv,import,ms-access-2007,Ms Access,Csv,Import,Ms Access 2007,我的任务是将大约180个csv文件导入access 2007数据库。这些文件多年来一直放在一起,将放在3个文件夹中的1个文件夹中。我没有对这些表设置任何数据检查或限制(例如主键、验证规则或关系)。这将在导入数据后完成。这些文件中包含的数据来自一项多年来发生变化的调查。此更改导致字段更改。它们的顺序已经改变,或者有时字段在那里,有时字段不在那里。我有一个列表,列出了所有可能的字段,以及每个csv文件应该导入到哪个表中,并且知道所有这些字段都可以是文本 我的问题是:不知道列的顺序或是否存在列,是否可

我的任务是将大约180个csv文件导入access 2007数据库。这些文件多年来一直放在一起,将放在3个文件夹中的1个文件夹中。我没有对这些表设置任何数据检查或限制(例如主键、验证规则或关系)。这将在导入数据后完成。这些文件中包含的数据来自一项多年来发生变化的调查。此更改导致字段更改。它们的顺序已经改变,或者有时字段在那里,有时字段不在那里。我有一个列表,列出了所有可能的字段,以及每个csv文件应该导入到哪个表中,并且知道所有这些字段都可以是文本

我的问题是:不知道列的顺序或是否存在列,是否可以运行一个函数,通过将文本文件中的每一列映射到access表中的关联列,将这些文本文件导入到它们的相对表中

每个文本文件都有标题,这有助于了解它们的实际情况,但在处理完全由数字组成的id代码时,没有文本限定符会非常烦人。下面是我到目前为止所做的尝试。它从别处的函数获取文件位置,将该位置的每个文件名添加到集合中,然后尝试将该集合中的每个文件导入到其相对字段中

    'Get file names from the folder and store them in a collection
temp = Dir(location & "\*.*")
Do While temp <> ""
    fileNames.Add temp
    temp = Dir
Loop

'Go through each file in the collection and preccess it as needed
For Each temp2 In fileNames
    If (temp2 Like "trip*") Then 'Import trip files
        'Gets the data from a query 'DoCmd.RunSQL "SELECT * FROM [Text;FMT=Delimited;HDR=YES;IMEX=2;CharacterSet=437;DATABASE=" & location & "].[" & temp2 & "] As csv;"
        DoCmd.TransferText acImportDelim, "Trips_Import", "tbl_Trips", location & "\" & temp2, -1
    End If

    If (temp2 Like "catch*") Then 'Import catch files
        DoCmd.TransferText acImportDelim, "Catch_Import", "tbl_Catch", location & "\" & temp2, -1
    End If

    If (temp2 Like "size*") Then 'Import size files
        DoCmd.TransferText acImportDelim, "Size_Import", "tbl_Size", location & "\" & temp2, -1
    End If
Next temp2
”从文件夹中获取文件名并将其存储在集合中
temp=Dir(位置和“\*.*”)
当临时工“”时执行
文件名。添加临时文件名
temp=Dir
环
'检查集合中的每个文件,并根据需要对其进行预处理
对于文件名中的每个temp2
如果(temp2类似于“trip*”),则“导入trip文件”
'从查询'DoCmd.RunSQL'中获取数据,从[Text;FMT=Delimited;HDR=YES;IMEX=2;CharacterSet=437;DATABASE=“&location&]”中选择*作为csv;“&temp2&]”
DoCmd.TransferText acImportDelim,“Trips\u导入”、“tbl\u Trips”、位置和“\”和时间段2,-1
如果结束
如果(temp2类似于“catch*”),则“导入catch文件”
DoCmd.TransferText acImportDelim,“Catch\u Import”,“tbl\u Catch”,location&“\”和temp2,-1
如果结束
如果(temp2类似于“size*”),则“导入大小文件”
DoCmd.TransferText acImportDelim,“大小导入”、“tbl大小”、位置和“\”和时间段2,-1
如果结束
下一个temp2

您可以为每个CSV文件创建一个
选择*
查询,并将该查询作为记录集打开。打开目标表的另一个记录集

然后,对于CSV记录集中的每一行,向目标记录集中添加一行,循环通过CSV
字段
集合,并将每个CSV字段值添加到具有相同名称的目标字段

这种方法与CSV文件中字段的显示顺序无关。CSV文件是否只包含目标表中字段的子集也无关紧要。只要表中还存在每个CSV字段,它就应该工作(假设数据类型兼容,值满足验证规则/约束等)

Dim db作为DAO.Database
模糊fld为刀场
将rsDest设置为DAO.Recordset
Dim rsSrc作为DAO.Recordset
Dim strSelect As字符串
作为字符串的Dim strTableName
Set db=CurrentDb
'检查集合中的每个文件,并根据需要对其进行预处理
对于文件名中的每个temp2
选择案例左侧(temp2、4)
“旅行”一案
strTableName=“tbl\U行程”
案例“catc”
strTableName=“待处理”
案例“大小”
strTableName=“待确定大小”
其他情况
“这里会发生什么?
'这将在OpenRecordset(strTableName)上触发错误。。。
strTableName=vbNullString
“找到更好的选择
结束选择
strSelect=“选择csv.*FROM”&_
“[Text;FMT=Delimited;HDR=YES;IMEX=2;CharacterSet=437;DATABASE=“&_
位置&“].[”&temp2&“]作为csv;”
调试。打印strSelect
Set rsSrc=db.OpenRecordset(strSelect,dbOpenSnapshot)
Set rsDest=db.OpenRecordset(strTableName、dbOpenTable、dbAppendOnly)
带rsSrc
做而不做
rsDest.AddNew
对于每个fld In.字段
rsDest.Fields(fld.Name).value=fld.value
下一个
rsDest.Update
.下一步
环
.结束
以
rsDest.关闭
下一个temp2

注意:这是一种RBAR(一行接一行)方法,因此性能将低于一流水平。但是,我认为您只会这样做一次,因此性能的影响不会破坏交易。如果需要更快的基于集合的方法,可以为每个CSV文件构建并执行“追加查询”。为此,您首先需要获取CSV字段名,然后在语句中构建相应的
插入。

非常感谢您的快速回复。我试过这样的东西。实际上,这就是您所说的追加查询方法。这样做的问题是它不会将文本保留为文本(即15位ID代码)。我尝试将:rsDest.Fields(fld.Name).value=fld.value更改为:rsDest.Fields(fld.Name).value=CStr(fld.value),但我认为在查询csv文件时会出现问题。还感谢您对可能的文件名进行额外的错误检查。真不敢相信我错过了!然后,CStr(fld.Value)
发生了什么?它会抛出错误吗?不会抛出错误。这似乎没什么作用。无论是否使用转换,所有大数字(应该是文本)都以科学记数法输出。access似乎会将任何假定为数字的内容作为SELECT查询中的数字读入。有没有办法在access中覆盖此项?只是尝试了一下,但没有成功。我还尝试了:If(IsNumeric(fld.Value)),然后rsDest.Fields(fld.Name)。Value=FormatNumber(fld.Value,0,-1,0,0)或者rsDest.Fields(fld.Name)。Value=fld.Value End If