2017-05-09 84 views
0

我想输入一个csv文件到Visual Basic数据网格。但是每次我尝试调用一个条目时,它只会读取第一行,目标是读取一个随机行并将该名称输入到列中。从CSV文件读取只返回在Visual Basic中的一行

CSV文件:

Noah, 
Liam, 
Mason, 
Jacob, 
William, 
Ethan, 
James, 
Alexander, 
Michael, 
Benjamin, 
Elijah, 
Daniel, 
Aiden, 
Logan, 
Matthew, 
Lucas, 
Jackson, 
David, 
Oliver, 
Jayden, 
Joseph, 
Gabriel, 
Samuel, 
Carter, 
Anthony, 
John, 
Dylan, 
Luke, 
Henry, 
Andrew, 
Isaac, 
Christopher, 
Joshua, 
Wyatt, 
Sebastian, 
Owen, 
Caleb, 
Nathan, 
Ryan, 
Jack, 
Hunter, 
Levi, 
Christian, 
Jaxon, 
Julian, 
Landon, 
Grayson, 
Jonathan, 
Isaiah, 
Charles, 
Thomas, 
Aaron, 
Eli, 
Connor, 
Jeremiah, 
Cameron, 
Josiah, 
Adrian, 
Colton, 
Jordan, 
Brayden, 
Nicholas, 
Robert, 
Angel, 
Hudson, 
Lincoln, 
Evan, 
Dominic, 
Austin, 
Gavin, 
Nolan, 
Parker, 
Adam, 
Chase, 
Jace, 
Ian, 
Cooper, 
Easton, 
Kevin, 
Jose, 
Tyler, 
Brandon, 
Asher, 
Jaxson, 
Mateo, 
Jason, 
Ayden, 
Zachary, 
Carson, 
Xavier, 
Leo, 
Ezra, 
Bentley, 
Sawyer, 
Kayden, 
Blake, 
Nathaniel, 
Ryder, 
Theodore, 
Elias, 
Tristan, 
Roman, 
Leonardo, 
Camden, 
Brody, 
Luis, 
Miles, 
Micah, 
Vincent, 
Justin, 
Greyson, 
Declan, 
Maxwell, 
Juan, 
Cole, 

验证码:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    ' Initialize the random-number generator 
    DataGridView1.Rows.Clear() 

    For ix As Integer = 1 To 115 

     Dim intValue As Integer = CInt(Int((5000 * Rnd()) + 1)) 
     Dim intRandomNumber As Integer 
     Dim randomName As String = 0 

     intRandomNumber = (100 * Rnd()) 
     Dim dat(230) As String 'This array holds each item from csv ile 
     Dim num As Integer = 0 
     Dim c, p, z As Integer 
     Dim firstNames(115) As String 
     Dim blankSpace(115) As Integer 
     Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser("firstNames.txt") 
      MyReader.TextFieldType = FileIO.FieldType.Delimited 
      MyReader.SetDelimiters(",") 
      Dim currentRow As String() 

      'This section reads the text file into one array dat() 
      While Not MyReader.EndOfData 
       Try 
        currentRow = MyReader.ReadFields() 
        For Each currentField In currentRow 
         num = num + 1 
         dat(num) = currentField 
        Next 
        'error reporting 
       Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException 
        MsgBox("Line " & ex.Message & "is not valid and will be skipped.") 
       End Try 
      End While 
      p = 0 
      For c = 1 To num Step 2 
       p = p + 1 
       firstNames(p) = dat(c) 
      Next 
     End Using 
     For c = 1 To p 
      DataGridView1.Rows.Add(Format(ix, "00000"), firstNames(c), "", "", "", intValue) 
     Next 
    Next 
End Sub 
+0

我怀疑你的代码在重复循环之前抛出一个异常。读取文件时,Visual Studio输出窗口中是否显示任何内容? – Dai

+1

另外,'String.Split'对于解析CSV文件并不是一个好的功能,因为它无法处理嵌入在引用字符串中的逗号,例如。 – Dai

+0

您的代码每次都重新打开文件 - 这也是问题的一部分。 – Dai

回答

0

下面的方法将返回的随机行指定数量从文件:

'Random number generator. 
Private rng As New Random 

Private Function GetRandomLines(filePath As String, lineCount As Integer) As String() 
    Return IO.File.ReadAllLines(filePath). 
        OrderBy(Function(s) rng.NextDouble()). 
        Take(lineCount). 
        ToArray() 

End Function 

您可以致电该方法,然后循环通过结果,分裂和加载。如果您只需要一行而不是多个,那么您可以拨打FirstFirstOrDefault并返回String而不是数组。

关于分割数据,如果可能包含带引号的字段值包含逗号,则最好使用TextFieldParser。问题在于,你必须分割每一行,然后才能知道有多少,这意味着多余的工作。

+0

不适合随机排序。可能会将程序置于排序未完成的状态。 –

+0

@JoelCoehoorn,我从来没有听说过这样的事情。你能描述一下吗? – jmcilhinney

+0

会发生什么情况.Net会在OrderBy()期间为同一个值多次调用'rng.NextDouble()',因为它会将该值与序列中的其他项目进行比较。有一次结果可能会更高,将项目推回到序列中。另一次可能会更低,推动它前进。如果运气不好,功能可能永远不会结束,或者至少花费比预期更长的时间。 –