2012-01-11 107 views
0

我目前正在处理涉及CSV文件的项目。我最初使用Microsoft.Jet.OLEDB.4.0来提取一切。然而,有很多数字有时并没有完成并被“消隐”。将字符串列表转换为数据集或数据表

因此,在做了一些研究之后,我找到了一个可以将所有内容填入列表的例子。例如:

Dim lstExample As New List(Of String)(). 

从这里我可以使用SteamReader抓取csv文件并存储它。由于前3行是垃圾,我正在跳过这些行,并阅读其余的行以及大约30列逗号分隔数据。

我现在的问题是我无法将lstExample导入数据集或数据表。我甚至手动创建了一个列表,但仍然出错。

错误发生在这条线:

dataRow(i) = itemProperties(i).GetValue(item, Nothing) saying "Parameter count mismatch." 

任何想法得到一个列表到数据集/数据表?

Public Shared Sub ManualReadCSVFile(ByVal strFilePath As String) 
    Dim lstExample As New List(Of String)() 

    Using reader = New StreamReader("c:\SFTP_Target\ATL-536437.csv") 
     For i As Integer = 0 To 2 
      reader.ReadLine() 
     Next 

     While Not reader.EndOfStream 
      Dim line = reader.ReadLine() 
      Dim values = line.Split(",") 

      lstExample.Add(values(0)) 

     End While 

     reader.Dispose() 
    End Using 

    'Dim list As New List(Of String)(New String() {"nile", _ 
    ' "amazon", _ 
    ' "yangtze", _ 
    ' "mississippi", _ 
    ' "yellow"}) 

    Dim dsTest As New DataSet 
    dsTest = CreateDataSet(lstExample) 
    'dsTest = CreateDataset(list) 

End Sub 

Public Shared Function CreateDataSet(Of T)(ByVal list As List(Of T)) As DataSet 
    'list is nothing or has nothing, return nothing (or add exception handling) 
    If list Is Nothing OrElse list.Count = 0 Then 
     Return Nothing 
    End If 

    'get the type of the first obj in the list 
    Dim obj = list(0).[GetType]() 

    'now grab all properties 
    Dim properties = obj.GetProperties() 

    'make sure the obj has properties, return nothing (or add exception handling) 
    If properties.Length = 0 Then 
     Return Nothing 
    End If 

    'it does so create the dataset and table 
    Dim dataSet = New DataSet() 
    Dim dataTable = New DataTable() 

    'now build the columns from the properties 
    Dim columns = New DataColumn(properties.Length - 1) {} 
    For i As Integer = 0 To properties.Length - 1 
     columns(i) = New DataColumn(properties(i).Name, properties(i).PropertyType) 
    Next 

    'add columns to table 
    dataTable.Columns.AddRange(columns) 

    'now add the list values to the table 
    For Each item In list 
     'For Each item As T In list 
     'create a new row from table 
     Dim dataRow = dataTable.NewRow() 

     'now we have to iterate thru each property of the item and retrieve it's value for the corresponding row's cell 
     Dim itemProperties = item.[GetType]().GetProperties() 

     For i As Integer = 0 To itemProperties.Length - 1 
      dataRow(i) = itemProperties(i).GetValue(item, Nothing) 
     Next 

     'now add the populated row to the table 
     dataTable.Rows.Add(dataRow) 
    Next 

    'add table to dataset 
    dataSet.Tables.Add(dataTable) 

    'return dataset 
    Return dataSet 
End Function 

回答

0

如果您只是试图将csv文件解析为.net对象,请尝试http://www.filehelpers.com。这是将csv文件解析为POCO或数据表的简单方法。

+0

杰森,感谢您的答复。我一直在用他们的例子来处理我的csv文件。实际上,我已经将它存储在一个.Net对象中。现在我把它放到一个对象中,我怎样才能将它转换为数据表或数据集?手动输入 – user1143550 2012-01-11 19:14:54

+0

。尽管我认为有一个选项可以直接导入到文件保护程序中的数据表。 – 2012-01-11 19:19:01

+0

你是对的。他们有一个叫做班级建造者的东西。去链接http://www.filehelpers.com/runtime_classes.html显示一个例子。在确定我需要添加正确的列数后,我使用分隔的示例并正确地工作。另一个很好的功能是可以忽略来自顶端的行,因为这个csv文件来自第三方。谢谢一堆! – user1143550 2012-01-11 19:40:13

相关问题