F# - MS Access上传选项卡分隔的文本数据

时间:2014-03-14 13:00:38

标签: database ms-access f#

我正在尝试将制表符分隔的文本文件上传到Access数据库。我有以下代码:

Let connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\...\testdb.accdb;Security Info=False;"
let connection = new OleDb.OleDbConnection(connectionString)
connection.Open()
let query = "SELECT * INTO [temp] FROM [Text;DATABASE=C\...].[name.txt]"
let command = new OleDb.OleDbCommand(query,connection)
command.Connection.Open()
command.ExecuteNonQuery()

此代码工作正常,但如何在MS Access中分离数据,以便它不是全部放入一列?

此外,是否有办法获取从MS Access中生成的数据或表格导入查询字符串,以便我可以在F#中使用它并在F#中使用它。

1 个答案:

答案 0 :(得分:2)

嘿,我已经使用了一个schema.ini文件,正如@Remou建议的那样。

这些是我经历的步骤:

1)创建一个名为" testdb.accdb"的访问数据库。在目录" C:\ AccessDatabaseTest \"

2)创建一个名为" TestData.txt"的标签分隔文件。在目录" C:\ AccessDatabaseTest \"具有以下内容:

ID  TestColA    TestColB
1   9   TestA
2   10  TestB
3   11  TestC

3)创建一个名为" schema.ini"的文件。在目录" C:\ AccessDatabaseTest \"具有以下内容:

[TestData.txt]
Format=TabDelimited

4)运行以下F#脚本文件:

#r "System.Data"

open System.Data.OleDb 

let loadData() =
    let connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\AccessDatabaseTest\testdb.accdb';Persist Security Info=False;"
    use connection = new OleDbConnection(connectionString)
    connection.Open()
    let query = "SELECT * INTO TestTable FROM [Text;HDR=YES;DATABASE=C:\AccessDatabaseTest].[TestData.txt]"
    use command = new OleDbCommand(query,connection)
    command.ExecuteNonQuery()

loadData()

出于某种原因,使用显式使用TabDelimited属性的命令

"SELECT * INTO TestTable FROM [Text;FMT=TabDelimited;HDR=YES;DATABASE=C:\AccessDatabaseTest].[TestData.txt]"
如果未使用schema.ini文件,则

不起作用

你也可能已经注意到我使用的连接字符串略有不同,因为它有"坚持安全信息"而不只是"安全信息"并且F#脚本对暴露IDisposable接口的对象使用绑定,因此当它超出范围时会自动处理掉。有关详细信息,请参阅here

修改

此版本在没有schema.ini文件的情况下运行。它基本上使用开源库F# Data将制表符分隔文件转换为csv文件,然后加载csv文件。您可以通过在Visual Studio中使用NuGet package manager下载来手动获取它。

#r "System.Data"
#r "../packages/FSharp.Data.2.0.3/lib/net40/FSharp.Data.dll"

open System.Data.OleDb 
open FSharp.Data

let loadDataNoSchemaIni() =
    let connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\AccessDatabaseTest\testdb.accdb';Persist Security Info=False;"
    // Load tsv file and save to a csv file using F# Data Csv Parser API
    CsvFile.Load(@"C:\AccessDatabaseTest\TestData.txt","\t",'"',true)
        .Save(@"C:\AccessDatabaseTest\TestData.csv",',','"')
    use connection = new OleDbConnection(connectionString)
    connection.Open()
    let query = "SELECT * INTO TestTable FROM [Text;HDR=YES;DATABASE=C:\AccessDatabaseTest].[TestData.csv]"
    use command = new OleDbCommand(query,connection)
    command.ExecuteNonQuery()

loadDataNoSchemaIni()