2012-11-15 4 views
3

우리는 CSV 파일을 앞뒤로 전달하는 (실제로는 오래된 학교) 다른 시스템과 통합되었습니다.CSV 파일 구문 분석

구조는 일반적으로 :

ID, Name, PhoneNumber, comments, fathersname 
1, tom, 555-1234, just some random text, bill 
2, jill smith, 555-4234, other random text, richard 

모든 너무 자주 우리는이를 참조하십시오

3, jacked up, 999-1231, here 
be dragons 
amongst us, ted 

내가 선 차단기 (\n가)의 중간에 발생하는 것을 감지하는 신경의 주요 문제 그것이 레코드 종료 자일 때의 레코드.

안정적으로 문제를 해결하기 위해 사전 처리 할 수 ​​있습니까?

다른 시스템에서 방출하는 것보다제로가 있음을 유의하십시오.

+0

저기에 많은 CSV 독자가 있습니다. 나는 이것을 과거에 성공적으로 사용했습니다. 정말 빠릅니다. http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader 규칙을 설정하고 조정할 수 있습니다. –

+2

잘못된 형식을 생성하고이를 두드리는 코드를 작성한 사람을 찾은 다음 코드를 새 FormatException();을 던져보십시오. 나는 대부분의 포매터가 필드를 따옴표없이 이것을 처리 할 수 ​​있다고 생각하지 않는다. 당신은 자신의 롤백해야합니다. – Servy

+0

당신이 nr을 셀 수 있다고 생각합니다. 새 줄에 이스케이프 처리되지 않은','문자가 포함되어 있고 실제로 0보다 크면 실제로 새 레코드가 아닙니다. – Magnus

답변

1

그래서 당신은 더 많거나 적은 같은 것을 할 수 있어야한다 :

(간단하게하기 위해 나는 모든 라인이 시작시에 읽은 가정
for (int i = 0; i < lines.Count; i++) 
{ 
    var fields = lines[i].Split(',').ToList(); 
    while (fields.Count < numFields)//here be dragons amonst us 
    { 
     i++;//include next line in this line 
     //check to make sure we haven't run out of lines. 

     //combine end of previous field with start of the next one, 
     //and add the line break back in. 
     var innerFields = lines[i].Split(','); 
     fields[fields.Count - 1] += "\n" + innerFields[0]; 

     fields.AddRange(innerFields.Skip(1)); 
    } 

    //we now know we have a "real" full line 
    processFields(fields); 
} 

, 나는 당신이 유유히 각 행을 가져올 수를 변경할 수있는 가정 쉽게 충분합니다.)

+0

나는 이것을 좋아한다. 그것을 줄 것이다. – NotMe

+0

완벽하게 일했습니다. – NotMe

0

예제에서 CSV 파일이 유효하지 않다고 말하겠습니다. 문자열 내에서 줄 바꿈이 발생하면 큰 따옴표로 묶어야합니다.

답변 -이 잘못된 csv 형식을 구문 분석하려면 몇 가지 가정을해야합니다. 이 경우 나는 2 가지 가정을했다. 1) ID 열은 숫자 여야한다. 2) 코멘트 필드는 숫자를 포함 할 수 없다.

이러한 가정에 따라 줄 바꿈 문자 다음의 첫 번째 문자를 확인할 수 있습니다. 자릿수 인 경우 새 레코드로 가정합니다. 그렇지 않으면 주석 필드의 계속 값으로 처리해야합니다.

두 번째 가정이 유효한지 여부는 알 수 없습니다. 그렇지 않은 경우 논리를 향상시켜 시스템의 비즈니스 규칙을 다룰 수 있습니다.

행운을 빌어 요!

+0

당신은 그것이 잘못되었다는 것에 대해 절대적으로 옳습니다. 그러나 쓰레기를 만든 빅 메가는 현재 3 년 동안 그것을 고칠 것을 약속했다; 그래서 나는 숨을 멈추지 않고있다. 불행히도 우리는 1을 보장 할 수 없으며 주석 필드는 숫자로 시작될 수 있습니다. – NotMe

0

먼저 CSV 파일을 읽고 쓰는 것을 관리하는 도구를 사용하는 것이 좋습니다. FileHelpers library을 사용합니다.

기본적으로 레코드를 입력 할 수 있으며 모든 유효성 검사를 수행합니다. 노력할 가치가있는.

아마도 파일에 대한 사전 처리 작업을 수행하고 Regex를 사용하여 줄 바꿈을 공백으로 대체 할 수 있습니까?

나는 비슷한 (안 파일이 있지만) 처리 중에이 작업을 수행하는 사용자 정의 변환을 작성하거나 BeforeRead 이벤트에 후크 수 FileHelpers으로

line.Replace(Environment.NewLine, " "); 

노력을한다.

+0

우리는 이미 FileHelpers를 사용하고 있습니다. 그러나 스펙을 충족시키지 않는 라인에서는 불기 때문에 무시하고 계속 진행하도록 설정합니다. 당신이 그것을 처리하기 위해 사용자 정의 변환기를 작성하는 것에 대한 세부 사항을 가지고 있다면 나는 관심을 가질 것이다. – NotMe