我使用以下代码将CSV文件导入Access DB。我只有几个问题。
Con.Open()
Dim strSqlCommand = "SELECT F1 AS id, F2 AS firstname " &
"INTO MyNewTable " &
"FROM [Text;FMT=Delimited;HDR=No;CharacterSet=850;DATABASE=" & GlobalVariables.strDefaultDownloadPath & "].Airports.csv;"
Dim sqlCommand = New System.Data.OleDb.OleDbCommand(strSqlCommand, Con)
sqlCommand.ExecuteNonQuery()
Con.Close()
如何将字符集更改为UTF-8?如果我输入utf8而不是850,我会收到错误。
此外,我的CSV文件的第一行包含列名称。我是否可以修改上述代码以将其纳入帐户?
此致
安德鲁
答案 0 :(得分:1)
您可能会在尝试导入并立即选择所有内容时遇到麻烦,但有一件事您可能不希望将数据类型转换为Access。为此,您将需要2个连接和SQL字符串来相互选择以插入另一个。
连接字符串需要看起来像这样:
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Temp\Tmp;Extended Properties='TEXT;HDR=Yes;FMT=Delimited;CharacterSet=ANSI'"
请注意,仅列出路径,并将Extended Properties
括在刻度中。如果第一行包含标题/字段名称,则HDR=Yes
将在结果集中跳过它们。将字段名称作为第一行的好处之一是OleDB将它们用作列名称(不需要F1 As foo, F2 As bar
;实际上这将失败,因为它们已经从F1,F2重命名...)。
要从CSV中读取的SQL:
"SELECT * FROM filename.csv"
有几种方法可以处理它。您可以使用阅读器一次读取一行以将其插入Access数据库。这可能更简单:将CSV中的所有数据导入DataTable并使用它插入Access:
Private myDT As DataTable ' form level variable
...
Dim csvStr As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Temp\Tmp;Extended Properties='TEXT;HDR=Yes;FMT=Delimited;CharacterSet=ANSI'"
Dim csvSQL = "SELECT * FROM Capitals.csv" ' use YOUR file name
Using csvCn = New OleDbConnection(csvStr),
cmd As New OleDbCommand(csvSQL, csvCn)
Using da As New OleDbDataAdapter(cmd)
myDT = New DataTable
da.Fill(myDT)
End Using
End Using
For Each r As DataRow In myDT.Rows
'ToDo: INSERT INTO Access
Next
Connection,Command和DataAdapter都是资源,所以当我们完成它们时,它们会在USING块中处理它们。 myDT
将包含Rows
的集合,每个集合都有一个代表CSV中字段的Items
集合。只需循环遍历将所需项添加到Access DB的行。
您很可能必须执行从String到Integer或DateTime等的相同数据类型转换。
关于UTF8的问题 - 您可以使用Codepage identifier。如果你将它从连接字符串中删除,它将使用注册表中的任何内容,它们也可以工作。对于UTF8,请使用CharacterSet=65001
。