2012-08-31 3 views
0

나는 약간의 악몽을 처리해야하는 CSV 파일이 있습니다. 본질적으로 다음과 같습니다데이터 처리 퍼즐/두통

"Id","Name","Description" 
"1","Test1","Test description text" 
"2","Test2","<doc><style>body{font-family:"Calibri","sans-serif";}</style><p class="test_class" 
name="test_name">Lots of word xdoc content here.</p></doc>" 
"guid-xxxx-xxxx-xxxx-xxxx","Test3","Test description text 3" 

나는 바퀴를 재발 명하기보다는 CSV를 처리하기 위해 File Helpers 라이브러리를 사용하고 있습니다. 그러나 따옴표가 포함 된 이스케이프 처리되지 않은 Word xdoc xml을 포함하는 설명 필드로 인해 각 레코드의 시작 지점과 끝 지점은 오히려 혼란스러워집니다.

다음은 매핑 클래스의 예입니다. 그들이 ','를 포맷 시작과 라인의 끝에서 " 모든 '을 대체 할 ' 다음 ((?<=(^|',))'|'(?=($|,'))) 패턴을 사용하여 모든 "를 교체

[DelimitedRecord(","), IgnoreFirst(1), IgnoreEmptyLines()] 
public class CSVDoc 
{ 
    #region Properties 
    [FieldQuoted('"', QuoteMode.AlwaysQuoted), FieldTrim(TrimMode.Both)] 
    public string Id; 
    [FieldQuoted('"', QuoteMode.AlwaysQuoted), FieldTrim(TrimMode.Both)] 
    public string Name; 
    [FieldQuoted('"', QuoteMode.AlwaysQuoted), FieldTrim(TrimMode.Both)] 
    public string Description; 
    [FieldQuoted('"', QuoteMode.AlwaysQuoted), FieldTrim(TrimMode.Both)] 
} 

내가 (작업의 이런 종류의 정규식 내 증오에도 불구하고) 고려 . 그러나 더러운 파일에는 "으로 끝나는 일부 줄과 서식이 지정된 CSS 스타일 속성이 포함되어 있습니다. ","

이제 어떻게해야 할 지, 어떻게 자동화 할 수 있는지 알아 내려고 노력하고 있습니다.

아이디어가 있으십니까?

+2

를 참조하십시오? – Oded

+0

FileHelpers를 사용하지 마십시오. 직접 간단한 수입 코드를 작성하십시오. 3 열에 불과합니다. 첫 번째 두 개를 정상적으로 분석 한 다음 나머지를 최종 설명 열로 처리합니다. –

+0

그러나 나는 깨끗한 소스를 요구할 계획을 가지고 있지만, 소스 시스템이 가능한지에 대해서는 확신 할 수 없기 때문에 대안을 찾기 위해 노력하고 있습니다. 처음에는 설명 필드를 가져 오는 것만으로도 충분했습니다. 이차적 인 문제는 모든 데이터가 사용자 생성이며 사용자에게 많은 제한이 있다고 생각하지 않는다. (슬프게도) 내 예제는 문제를 설명하기 위해 3 열이며 실제 데이터는 더 많습니다. – Hawxby

답변

0

휠을 다시 발명해야합니다. 유효한 CSV가 아니거나 합리적인 파일이 아니기 때문에 휠을 다시 발명해야합니다. 어떤 종류의 일관성있는 도주 규칙도 없습니다 (예 : 일반 텍스트 열은 올바르게 이스케이프 처리됩니다.

가장 좋은 방법이 버그를 해결하기 위해이 생산하는 사람을 요청하는 것입니다, 그것은해야한다 예를 들면 : 당신의 파서가 잘 처리해야하고이 생산할 수 있도록하는 하드해서는 안됩니다

"2","Test2","<doc><style>body{font-family:""Calibri"",""sans-serif"";}</style><p class=""test_class"" 
name=""test_name"">Lots of word xdoc content here.</p></doc>" 

간단하고 효율적인 방법. 한 줄을 읽어

  1. : 그 실패

    , 당신은 할 수 손으로 코드를 파서을해야합니다. 당신이 충돌 할 때까지 ", 또는 공백.

  2. 아무것도 발견되지 않을 경우, CSV로 구문 분석합니다.
  3. 하나가 발견하는 경우 다음되지 않은 " ("이스케이프에 대한
  4. 확인,이 끔찍한 일로서 구문 분석

일관되게 올바른 행을 식별하는 경우 그 일관. 아니면 <doc의 다른 라인에 사용하지 않을 경우 <을 찾기 위해 쉽게 할 수있다 "로 끝나는 라인.

0

이전의 사전 처리 작업을해도 상관없는 경우 첫 번째 및 두 번째 ","을 "|"로 변경할 수 있습니다.

var sb = new StringBuilder() 
var regex = new Regex("\",\""); 
foreach(string line in textFileLines) 
{ 
    sb.AppendLine(regex.Replace(line , "\"|\"", 2)); 
} 
: 사전 처리 (간단한 의사 코드) 같은 것을 할 수

| (HTML 태그가 마지막 열에는없는 가정) 다음 일반적으로 파일을 구문 분석 FileHelper를 사용

+0

실제 데이터에는 더 많은 데이터 (열과 행 모두)가 있으므로 특정 항목을 대체 할 수는 없습니다. 어쨌든 고맙습니다 – Hawxby

+0

소스 파일을 수정하는 것이 가장 쉬운 옵션 인 것 같습니다. 그렇지 않으면 Jon Hanna가 파일 구문 분석을위한 특정 규칙과 조건을 작성해야 할 필요가 있다고 언급했습니다. – jeanfrancois

0

몇 달 전에 CSV-1203 파일 형식 표준을 사용 했으므로, 먼저 "xyz.CSV"라는 CSV 파일을 다루지는 않습니다.

여기 다른 사람들이 말했듯이, 독자가 독자적으로 작성하는 것이 더 쉽고 어렵지도 않습니다. 나도 모든 정규식에 대한 증오심을 가지고 있지만 좋은 소식은 당신이 그것을 사용하지 않고 어떤 코드를 코딩 할 수 있다는 것입니다.

몇 가지 : Excel에서 두 개의 대문자 ID (따옴표 제외)로 시작하는 CSV 파일에 실제로 이상한 일이 있습니다. 귀하의 CSV가 손상된 SYLK 파일이라고 생각합니다! 시도 해봐.

이 문제와 상세한 CSV 파일 형식 사양에 대한 자세한 내용은, 당신이 아닌 _clean/valid_ 데이터 소스를 요청할 수 http://mastpoint.curzonnassau.com/csv-1203