我正在使用以下代码将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文件的第一行包含列名称。我可以修改上面的代码以考虑到这一点吗?
问候,
安德鲁
您可能会遇到尝试一次导入并全部选择所有对象的麻烦,因为一件事,您可能不希望将数据类型转换为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重命名而将失败)。
Extended Properties
HDR=Yes
F1 As foo, F2 As bar
从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,每个集合都Items表示CSV中的字段。只需循环遍历将所需项添加到Access DB的行。
myDT
Rows
Items
您很可能必须将相同的数据类型从String转换为Integer或DateTime等。
至于有关UTF8的问题,您可以使用Codepage标识符。如果将其保留为连接字符串,它将使用注册表中可能有效的任何内容。对于UTF8使用CharacterSet=65001。
CharacterSet=65001