2011-04-25 3 views
2

CSV 파일에서 값을 가져와야하는 프로젝트에서 작업하고 있습니다. 이 값으로 추가 처리를해야하며 2D 배열에서이 값을 가질 수 있으면 좋을 것입니다. CSV 파일의 행 및 열 수는 정기적으로 변경됩니다.VB.NET : CSV 파일을 2D 배열로 읽기

VB.NET/C#에서이 값을 2D 배열로 가져올 수 없습니다. 그걸 좀 도와 주실 수 있을까요? 여기

내가 사용하는 코드 :

Imports System.IO 

Public Class Form1 
    Private Sub ReadCSVFileToArray() 
     Dim strfilename As String 
     Dim num_rows As Long 
     Dim num_cols As Long 
     Dim x As Integer 
     Dim y As Integer 
     Dim strarray(1, 1) As String 

     ' Load the file. 
     strfilename = "test.csv" 

     'Check if file exist 
     If File.Exists(strfilename) Then 
      Dim tmpstream As StreamReader = File.OpenText(strfilename) 
      Dim strlines() As String 
      Dim strline() As String 

      strlines = tmpstream.ReadToEnd().Split(Environment.NewLine) 

      ' Redimension the array. 
      num_rows = UBound(strlines) 
      strline = strlines(0).Split(",") 
      num_cols = UBound(strline) 
      ReDim strarray(num_rows, num_cols) 

      ' Copy the data into the array. 
      For x = 0 To num_rows 
       strline = strlines(x).Split(",") 
       For y = 0 To num_cols 
        strarray(x, y) = strline(y) 
       Next 
      Next 

      ' Display the data in textbox 

      For x = 0 To num_rows 
       For y = 0 To num_cols 
        TextBox1.Text = TextBox1.Text & strarray(x, y) & "," 
       Next 
       TextBox1.Text = TextBox1.Text & Environment.NewLine 
      Next 

     End If 
    End Sub 


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     ReadCSVFileToArray() 
    End Sub 
End Class 
+0

관련 : http://stackoverflow.com/questions/906841/csv-parser-를 reader-for-c, http://stackoverflow.com/questions/1103495/is-there-a-proper-way-to-read-csv-files, http://stackoverflow.com/questions/3509640 reading-csv-file-c –

답변

0

를 열과 행의 수 때문에 당신은 오히려 고정 된 2 차원 배열보다 동적 목록을 사용할 수 있습니다, 자주 변경.

List<List<string>> data = new List<List<string>>(); 

그런 다음 CSV는 CSV 파일의 각 새 행에 대한 새 List<string>data에 추가, 위의 구조에서 동적 데이터를 구축 할 수 있습니다 파일을 구문 분석한다.

업데이트 : VB.NET에 해당 말했다되고 그건

data As New List(Of List(Of String)) 

, @ 마크 Gravell의 제안이 직접하는 것보다 훨씬 더 나은 솔루션입니다 같은 것입니다.

2

을 사용하면 csv (또는 다른 유사한 데이터)를 DataTable (또는 IDataReader)으로 쉽고 편리하게 읽을 수 있습니다. 이 시나리오는 항상 빠르고 강력합니다.

+0

VS2012와 호환되지 않는 것으로 보입니다. 아니 downvote, 그냥 정보. – Kez

+0

@Kez 어떤 방식으로? 무엇이 실패합니까? 어떤 프레임 워크를 타겟팅하고 있습니까? (IDE는 net20, net30, net35, net40, net45뿐만 아니라 netcore ("windows store"), CF, MF, SL, WP7 등 많은 프레임 워크를 대상으로 할 수 있습니다. –

0

CSV 파일의 구문 분석은 가능한 모든 CSV 변형으로 인해 매우 어려울 수 있습니다. 참조 : http://en.wikipedia.org/wiki/Comma-separated_values

예 : 포함 된 따옴표, 쉼표 등을 고려하십시오. 따라서 줄/문자열을 읽고 분할하는 것은 간단하지 않습니다.

아마도 당신은 당신이 바퀴를 다시 발명하려고하지해야하기 때문에, 내가 마크 Gravell와 의견이 맞지 않을거야 a third party library

0

를 사용하여 더 나은입니다. 그의 솔루션은 최고 수준의 성능을 발휘할 것이며, 아래에 설명 된 것과 같은 간단한 파서를 망칠 수있는 많은 CSV 형식의 뉘앙스가있을 수 있습니다.

그런데 2D 배열을 반환하는 CSV 파서를 요청했습니다. 아래의 코드는 그 (지그재그 배열)을 수행하며 매우 간단한 CSV 파일에서 작동합니다. 그러면 파일의 머리글 행을 건너 뜁니다.

(죄송는 VB에서 아니지만, 당신은 당신의 프로젝트에 헬퍼 클래스에 넣을 수 있습니다)

private string[][] GetData(string fileName) 
{ 
    List<string[]> data = new List<string[]>(); 

    using (StreamReader sr = new StreamReader(fileName)) 
    { 
    bool headerRow = true; 
    string line; 

    while ((line = sr.ReadLine()) != null) 
    { 
     if (headerRow) 
     { 
     headerRow = false; 
     } 
     else 
     { 
     string[] split = line.Split(new char[] { ',' }); 

     data.Add(split); 
     } 
    } 
    } 

    return data.ToArray(); 
}