2014-04-14 3 views
0

CSV (Excel로 열림) 파일을 읽고 데이터베이스에 레코드를 저장해야합니다. 내가하고있는 일은 먼저 문자열 배열로 모든 라인을 읽고 DataTable에 데이터를로드 한 다음 데이터베이스에 푸시합니다. 일부 필드는 쉼표가 있으며 쉼표로 필드를 분할하기 때문에 문제가 발생합니다. CSV는 고객으로부터 얻는 것이며 내가 형식을 올바르게 지정하도록 요구할 권한이 없습니다. 이 문제를 해결하는 방법에 대한 아이디어?쉼표로 구분 된 CSV에서 쉼표로 필드를 읽는 방법은 무엇입니까?

코드 :

Dim dt As New DataTable 
Dim fields() As String 
Dim lines() As String = File.ReadAllLines(fileName) 

'Create headers 
lines(1) = lines(1).Replace(Chr(34), "") 
     For Each header As String In lines(1).Split(",") 
      dt.Columns.Add(header) 
     Next 

'Fill data 
For i As Integer = 1 To lines.Count() - 1 
     fields = lines(i).Split(",") 
     dt.Rows.Add(fields) 
Next 

샘플 데이터 행 :

540,TestName,**$2,136.02**,0.15%,8004310/01 

그래서이 6 개 값에 나누기가 불행하게도 5

+1

분할 (그것처럼 나던 바로 그겁니다, Excel에서, 필드는 따옴표로 둘러싸여)() - 상기 쉼표에 보내고하는 것은 CSV 데이터를 읽을 수있는 끔찍한 방법입니다. 대신 Microsoft.VisualBasic.TextFieldParser, FastCSV, LinqToCSV 등과 같이 전용 CSV 파서를 찾아야합니다. –

+0

동의합니다. 나는 이것들을 살펴보고 CSV를 효율적으로 읽으려고 노력할 것이다. – voddy

+0

효과가있었습니다! HasFieldsEnclosedInQuotes = True로 시도했습니다. – voddy

답변

2

해야로서, CSV 형식으로 같은 문제 경향이있다 당신이 설명하는 것.

일반적인 해결 방법은 다른 구분 기호로 값을 묶는 것입니다. 예를 들어, 각 값에 큰 따옴표를하고 적용 할 고객을 요청할 수 있습니다

"540", "TESTNAME", "$ 2,136.02", "0.15 %", "8004310/01"

거기에서 쉼표로 분리 된 큰 따옴표 사이의 값을 읽는 라인 파서가 있어야합니다.

이렇게해도 모든 값이 사라지지 않을 수도 있습니다 (예 : 값 중 하나에 큰 따옴표가있는 경우). 그러나 대부분의 값이 숫자 일 때 줄여야합니다.

체크 아웃이 내가 조엘 Coehoorn의 끝을 분류하는 방법이다 유용한 링크

CSV parser/reader for C#?

0

이 포함이 다른 스레드를. TextFieldParser를 사용하는 것이 훨씬 깔끔한 방법입니다.

Dim parser As TextFieldParser 

parser = New TextFieldParser(fileName) 
parser.HasFieldsEnclosedInQuotes = True 
parser.SetDelimiters(",") 

While Not parser.EndOfData 
     fields = parser.ReadFields() 
     <--Handle data--> 
End While 
+0

이것은 어떻게 든 내 대답의 변형입니다. – DanielCuadra

+0

예. 나는 너의 것을 받아 들였다. 나는 그가 나에게 잘 몰랐던 TextFieldParser에게 팁을 주었다. – voddy

관련 문제