vb.net 在VB.net中将csv数据转换为DataTable,从第0行捕获列名

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/30201592/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-17 19:07:36  来源:igfitidea点击:

convert csv data to DataTable in VB.net, capturing column names from row 0

vb.netcsvimportdatatable

提问by Gavin142

I've adapted the code from the @tim-schmelter answer to question convert csv data to DataTable in VB.net(see below)

我已经将@tim-schmelter 回答中的代码改编为问题 将 csv 数据转换为 VB.net 中的 DataTable(见下文)

I would like to parse in the column titles from row 0 of the csv file

我想从 csv 文件的第 0 行解析列标题

DT|Meter Number|Customer Account Number|Serial Number|Port...

but I'm not having any luck trying to figure out how to do this. any suggestions would be very appreciated.

但我没有任何运气试图弄清楚如何做到这一点。任何建议将不胜感激。

Public Function csvToDatatable_2(ByVal filename As String, ByVal separator As String)
    '////////////////////////////////////////
    'Reads a selected txt or csv file into a datatable 
    'based on code from  http://stackoverflow.com/questions/11118678/convert-csv-data-to-datatable-in-vb-net
    '////////////////////////////////////////
    Dim dt As System.Data.DataTable

    Try
        dt = New System.Data.DataTable
        Dim lines = IO.File.ReadAllLines(filename)
        Dim colCount = lines.First.Split(separator).Length

        For i As Int32 = 1 To colCount
            dt.Columns.Add(New DataColumn("Column_" & i, GetType(String)))
        Next

        For Each line In lines
            Dim objFields = From field In line.Split(separator)
            Dim newRow = dt.Rows.Add()
            newRow.ItemArray = objFields.ToArray()
        Next

    Catch ex As Exception
        Main.Msg2User(ex.Message.ToString)
        Return Nothing

    End Try

    Return dt

End Function

回答by OneFineDay

Just loop thru all the line of the file. Use a boolean to check for the first row.

只需遍历文件的所有行。使用布尔值检查第一行。

Public Function csvToDatatable_2(ByVal filename As String, ByVal separator As String)
 Dim dt As New System.Data.DataTable
 Dim firstLine As Boolean = True
 If IO.File.Exists(filename) Then
   Using sr As New StreamReader(filename) 
     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

回答by TonyT

Here is a hybrid of the two solutions above, with a few other changes:

这是上述两种解决方案的混合体,还有一些其他变化:

Public Shared Function FileToTable(ByVal fileName As String, ByVal separator As String, isFirstRowHeader As Boolean) As DataTable
  Dim result As DataTable = Nothing
  Try
    If Not System.IO.File.Exists(fileName) Then Throw New ArgumentException("fileName", String.Format("The file does not exist : {0}", fileName))
    Dim dt As New System.Data.DataTable
    Dim isFirstLine As Boolean = True
    Using sr As New System.IO.StreamReader(fileName)
      While Not sr.EndOfStream
        Dim data() As String = sr.ReadLine.Split(separator, StringSplitOptions.None)
        If isFirstLine Then
          If isFirstRowHeader Then
            For Each columnName As String In data
              dt.Columns.Add(New DataColumn(columnName, GetType(String)))
            Next
            isFirstLine = True ' Signal that this row is NOT to be considered as data.
          Else
            For i As Integer = 1 To data.Length
              dt.Columns.Add(New DataColumn(String.Format("Column_{0}", i), GetType(String)))
            Next
            isFirstLine = False ' Signal that this row IS to be considered as data.
          End If
        End If
        If Not isFirstLine Then
          dt.Rows.Add(data.ToArray)
        End If
        isFirstLine = False ' All subsequent lines shall be considered as data.
      End While
    End Using
  Catch ex As Exception
    Throw New Exception(String.Format("{0}.CSVToDatatable Error", GetType(Table).FullName), ex)
  End Try
  Return result
End Function