2011-05-07 75 views
0

我想将文本文件加载到Access 2007表中。我知道你可以逐行读取文件,然后在每行之外创建一条记录。我试图看看是否可以用INSERT INTO来完成,而不是循环遍历所有文本行。我的文本文件不是字符分隔,而是固定的列宽。例如:VB2005导入固定宽度的文本文件到Access2007表...几乎?

Date Speed Weight CarID Fuel 
1120 200  10000 T230  200 
1112 215  11000 F3AE  160 

例子中的数据以提高可读性空间,但在现实中的数据,像这样

112020010000T230200 
111221511000F3AE160 

反正团聚在一起。我试图

Dim sImportFolder As String = "C:\MyData" 
    Dim sSource As String = "C:\data.accdb" 
    Dim sImportFile As String = "week.txt" 

    Dim AccessConn As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sSource & ";Persist Security Info=True;Jet OLEDB:Database Password=blah") 
    AccessConn.Open() 'open the connection to the database 

    Dim AccessCommand As New System.Data.OleDb.OleDbCommand("INSERT INTO [tblData] ([PtDate], [PtSpeed], [PtWt], [PtCar], [PtFuel]) SELECT F1, F2, F3, F4, F5 FROM [Text;DATABASE=" & sImportFolder & ";].[" & sImportFile & "]") 
    AccessCommand.Connection = AccessConn 
    AccessCommand.ExecuteNonQuery() 

    AccessConn.Close() 

我不能图了解如何告诉命令数据的结构。我知道你可以使用模式文件,但必须通过代码完成这一切。

AGP

回答

0

有上所以这里一个类似的问题:

Read fixed width record from text file

基本上,答案是,有没有简单的东西,你可以在代码做指定的模式和它为你分手了。你需要做的是循环遍历每一行,使用SubString提取数据,然后每行插入Access(不是非常高效),或者你可以在循环中创建一个DataTable,然后在Access中执行插入操作数据库使用DataTable。要构建DataTable,您仍然需要解析数据(使用SubString或RegEx)。

+0

我很困惑这一切。只要您定义列宽,Access/Jet/ACE读取固定宽度的文件就没有问题。这可以使用Access内的导入向导来完成,然后可以在外部Access的代码中使用导入规范(和/或schema.ini文件)。 – 2011-05-07 20:58:53

+0

好吧,我陷入了困境。但我真的很想在不依赖内部Access规范或schema.ini文件的情况下实现它。也许不能做到这一点,在这种情况下,我可能别无选择。 – sinDizzy 2011-05-08 01:10:40

+0

我想不出有什么办法可以做到,除非直接打开文件并通过。但是,你仍然需要知道列边界在什么地方做出来,所以我不明白这种方法会如何优于所提出的替代方案。 – 2011-05-12 00:52:46

相关问题