以 OLEDB 连接方式打开 CSV 文件会将文件文本转换为双精度
Opening a CSV file as a OLEDB Connection converts file text to double
我正在打开几个 CSV 文件,并根据我找到的示例将它们作为 DataTable 读入 here。我在 运行 中遇到的问题是我用来导入数据的基本查询是将 IP 地址列转换为双精度。所以我想读取 10.0.0.1,它显示为 10.001。如何让此列作为字符串读入?如果可以的话,我不想对文件进行双重处理。
我使用的查询是基本的,如下所示:
SELECT * FROM [ComputerList.csv]
这是我打开 CSV 文件并将其读入 DataTable 的函数
Public Function OpenFile(ByVal strFolderPath as String, ByVal strQuery as String) as DataTable
Dim strConn as String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFolderPath & ";Extended Propteries=""text; HDR=Yes;FMT=Delimited"""
Dim conn as OleDb.OleDbConnection = New OleDb.OleDbConnection(strConn)
Try
conn.Open()
Dim cmd as OleDb.OleDbCommand = New OleDb.OleDbCommand(strQuery, conn)
Dim da as OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter()
da.SelectCommand = cmd
Dim ds as DataSet = New DataSet()
da.Fill(ds)
da.Dispose()
return ds.Tables(0)
Catch
return Nothing
Finally
conn.Close()
End Try
End Function
我用它来读取 csv 并强制全部转换为字符串。
Public Function convert_csv_to_data_table(ByVal File As String, ByVal separator As String) As DataTable
Dim dt As New DataTable
Dim firstLine As Boolean = True
If IO.File.Exists(File) Then
Using sr As New StreamReader(File)
While Not sr.EndOfStream
If firstLine Then
firstLine = False
Dim cols = sr.ReadLine.Split(separator)
For Each col In cols
dt.Columns.Add(New DataColumn(col, GetType(String)))
Next
Else
Dim data() As String = sr.ReadLine.Split(separator)
dt.Rows.Add(data.ToArray)
End If
End While
End Using
End If
Return dt
End Function
编辑:- 这只适用于分隔符 btw
好的,我尝试了每个人建议的变体,并最终选择了它们之间的混合体。我的目标是读入 CSV 文件,以 DataTable 形式对其进行操作,然后他们将其写回。我的一些 CSV 文件在一个单元格中有多行,有些在一个单元格中有分隔符。您可以在下面找到我的混合解决方案,它利用 TextFieldParser 读取文件并将其分解。
Public Function OpenFile(ByVal File as String, NyVal delim as String) as DataTable
Dim dt as New DataTable()
Dim firstline as Boolean = True
Using MyReader as New Microsoft.VisualBasic.FileIO.TextFieldParser(File)
MyReader.TextFieldType = FileIO.FieldType.Delimited
MyReader.SetDelimiters(delim)
Dim currentRow as String()
While Not MyReader.EndOfData
Try
currentRow = MyReader.ReadFields()
If firstline
firstline = false
For Each col in currentRow
dt.Columns.Add(New DataColumn(col.ToString(), System.Type.GetType("System.String")))
Next
Else
dt.Rows.Add(currentRow.ToArray())
End If
Catch ex as Microsoft.VisualBasic.FileIO.MalformedLineException
Console.WriteLIne("Line " + ex.Message + " is not valid and will be skipped")
End Try
End While
End Using
return dt
End Function
我正在打开几个 CSV 文件,并根据我找到的示例将它们作为 DataTable 读入 here。我在 运行 中遇到的问题是我用来导入数据的基本查询是将 IP 地址列转换为双精度。所以我想读取 10.0.0.1,它显示为 10.001。如何让此列作为字符串读入?如果可以的话,我不想对文件进行双重处理。
我使用的查询是基本的,如下所示:
SELECT * FROM [ComputerList.csv]
这是我打开 CSV 文件并将其读入 DataTable 的函数
Public Function OpenFile(ByVal strFolderPath as String, ByVal strQuery as String) as DataTable
Dim strConn as String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFolderPath & ";Extended Propteries=""text; HDR=Yes;FMT=Delimited"""
Dim conn as OleDb.OleDbConnection = New OleDb.OleDbConnection(strConn)
Try
conn.Open()
Dim cmd as OleDb.OleDbCommand = New OleDb.OleDbCommand(strQuery, conn)
Dim da as OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter()
da.SelectCommand = cmd
Dim ds as DataSet = New DataSet()
da.Fill(ds)
da.Dispose()
return ds.Tables(0)
Catch
return Nothing
Finally
conn.Close()
End Try
End Function
我用它来读取 csv 并强制全部转换为字符串。
Public Function convert_csv_to_data_table(ByVal File As String, ByVal separator As String) As DataTable
Dim dt As New DataTable
Dim firstLine As Boolean = True
If IO.File.Exists(File) Then
Using sr As New StreamReader(File)
While Not sr.EndOfStream
If firstLine Then
firstLine = False
Dim cols = sr.ReadLine.Split(separator)
For Each col In cols
dt.Columns.Add(New DataColumn(col, GetType(String)))
Next
Else
Dim data() As String = sr.ReadLine.Split(separator)
dt.Rows.Add(data.ToArray)
End If
End While
End Using
End If
Return dt
End Function
编辑:- 这只适用于分隔符 btw
好的,我尝试了每个人建议的变体,并最终选择了它们之间的混合体。我的目标是读入 CSV 文件,以 DataTable 形式对其进行操作,然后他们将其写回。我的一些 CSV 文件在一个单元格中有多行,有些在一个单元格中有分隔符。您可以在下面找到我的混合解决方案,它利用 TextFieldParser 读取文件并将其分解。
Public Function OpenFile(ByVal File as String, NyVal delim as String) as DataTable
Dim dt as New DataTable()
Dim firstline as Boolean = True
Using MyReader as New Microsoft.VisualBasic.FileIO.TextFieldParser(File)
MyReader.TextFieldType = FileIO.FieldType.Delimited
MyReader.SetDelimiters(delim)
Dim currentRow as String()
While Not MyReader.EndOfData
Try
currentRow = MyReader.ReadFields()
If firstline
firstline = false
For Each col in currentRow
dt.Columns.Add(New DataColumn(col.ToString(), System.Type.GetType("System.String")))
Next
Else
dt.Rows.Add(currentRow.ToArray())
End If
Catch ex as Microsoft.VisualBasic.FileIO.MalformedLineException
Console.WriteLIne("Line " + ex.Message + " is not valid and will be skipped")
End Try
End While
End Using
return dt
End Function