以 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