2012-07-05 4 views
1

CSV 파일을 읽고 데이터 테이블을 작성하는 함수가 있습니다. 나는 그것이 내 자신이 아니라고 주장하지 않을 것이다. 나는 그것을 어디에서 얻었는지 기억하지 못한다.CSV 파일에서 DataTable 만들기? ASP.net VB

값에 ","쉼표가있는 일부 CSV를 처리해야만 내 기능이 작동합니다. 누구든지이 문제를 해결하기 위해이 문제를 해결할 수 있도록 도와 줄 수 있습니까?

고마워요 ..

샘플 CSV 파일

FirstName, LastName, Comment, "address, just city", 
    John, Smith, "you are very good, but ugly", London, 
    Britney, Spear, "I am a singer, and beautiful", New York, 

내 기능은 귀하의 문제가

Public Function BuildDataTable() As DataTable 

    Dim myTable As DataTable = New DataTable("MyTable") 
    Dim i As Integer 
    Dim myRow As DataRow 
    Dim fieldValues As String() 
    Dim myReader As IO.StreamReader 
    Dim csv2xml As New csv2xml 

    Try 
     'Open file and read first line to determine how many fields there are. 
     myReader = File.OpenText(_fileFullPath) 
     fieldValues = myReader.ReadLine().Split(_seperator) 
     'Create data columns accordingly 
     If _hasheader = False Then 
      For i = 0 To fieldValues.Length() - 1 
       myTable.Columns.Add(New DataColumn("Column(" & i & ")")) 
      Next 
     Else 
      'if the file has header, take the first row as header for datatable 
      For i = 0 To fieldValues.Length() - 1 
       myTable.Columns.Add(New DataColumn(fieldValues(i).Replace(" ", ""))) 
      Next 
     End If 

     'Adding the first line of data to data table 
     myRow = myTable.NewRow 

     'if the csv file has not got a column header. defined by radio button list on first page by user 
     'if csv file has header, then not need to read the first line 
     If _hasheader = False Then 
      For i = 0 To fieldValues.Length() - 1 
       myRow.Item(i) = fieldValues(i).ToString 
      Next 
      myTable.Rows.Add(myRow) 
     End If 

     'Now reading the rest of the data to data table 
     While myReader.Peek() <> -1 
      fieldValues = myReader.ReadLine().Split(_seperator) 
      myRow = myTable.NewRow 
      For i = 0 To fieldValues.Length() - 1 
       myRow.Item(i) = fieldValues(i).Trim.ToString 
      Next 
      'check if there are empty rows in csv, ignore empty rows 

      If Not csv2xml.AreAllColumnsEmpty(myRow) = True Then 
       myTable.Rows.Add(myRow) 
      End If 

     End While 
    Catch ex As Exception 
     'MsgBox("Error building datatable: " & ex.Message) 
     Dim oError As ErrorLog = New ErrorLog 
     oError.LogError(_strWebsiteName, _ 
      loginID, _ 
      ex.Source.ToString, _ 
      ex.Message.ToString, _ 
      , _ 
      ex.StackTrace.ToString) 
     oError = Nothing 
     Return New DataTable("Empty") 
     'Server.Transfer(CustomErrorPage) 
    Finally 
     csv2xml = Nothing 
     myRow = Nothing 
    End Try 
    myReader.Close() 
    Return myTable 

    End Function 
+4

이 질문을보십시오. http://stackoverflow.com/questions/1050112/how-to-read-a-csv-file-into-a-net-datatable ? rq = 1 – Steve

+0

실수로 파일의 행과 필드를 구문 분석하는 코드 부분을 생략 한 것처럼 보입니다. 그것은 당신의 질문에 가장 관련이있는 코드의 부분이라고 생각됩니다. –

답변

2

당신은 단순히 각 행의 문자열을 분할하여 열을 구문 분석하는 것처럼 보인다 구분 기호로 쉼표. 이 메서드는 모든 CSV 파일에서 작동하지 않습니다. 표시된 값이 쉼표를 포함하는 문자열 인 경우 전체 필드 값이 따옴표로 묶여 있기 때문입니다. 따라서 따옴표로 쪼개고 나머지는 쉼표로 구분하고 필드의 값에서 따옴표를 제거해야합니다. 이는 상당히 복잡한 알고리즘입니다. 당신은 자신을 그런 식으로 뭔가를 작성하거나 그것을 할 정규식을 사용하지만, 그 시점에서, 난 그냥 CSV 파일을로드 할 수 ADO를 사용하여 당신이 더 나을 거라고 생각 수 :

Public Function LoadCsvFile(filePath As String, hasHeader As Boolean) As DataTable 
    Dim folderPath As String = Path.GetDirectoryName(filePath) 
    Dim fileName As String = Path.GetFileName(filePath) 
    Dim hdr As String = Nothing 
    If hasHeader Then 
     hdr = "Yes" 
    Else 
     hdr = "No" 
    End If 
    Dim connectionString As String = String.Format("Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq={0};Extended Properties=""Text;HDR={1};FMT=Delimited""", folderPath, hdr) 
    Dim connection As New OdbcConnection(connectionString) 
    Dim adapter As New OdbcDataAdapter("SELECT * FROM [" + fileName + "]", connection) 
    Dim table As New DataTable() 
    adapter.Fill(table) 
    Return table 
End Function 
6

는 그냥 VB를 사용을 TextFieldParser 클래스를 만들고 HasFieldsEnclosedInQuotes 속성을 True로 설정합니다.

+0

우우. 좋은 것. 나는 그걸 몰랐다. +1 –