2010-03-11 6 views
0

탭으로 구분 된 텍스트 파일을 열고 해당 데이터를 데이터베이스에 삽입하는 간단한 애플리케이션이 있습니다.탭으로 구분 된 파일의 인용문

나는 데이터를 읽기 위해이 CSV 리더를 사용하고 있습니다 : http://www.codeproject.com/KB/database/CsvReader.aspx

을 그리고 그것은 모두 잘 작동합니다!

지금 내 클라이언트는 "ClaimDescription이"파일의 마지막에 새 필드를 추가하고 있으며, 이러한 청구에 대한 설명의 일부 데이터는, 예를 따옴표가 있습니다

"SUMISEI을 MARU NO 2 "- 일본의 바다

이것은 내 응용 프로그램에 큰 골칫거리가 될 것 같습니다. 다음과 같은 예외가 발생합니다.

CSV는 '1470'필드 '26 '위치'181 '근처에서 손상된 것으로 보입니다. 현재 원시 데이터 : ...

"원시 데이터"에서 클레임 설명 필드에는 따옴표가있는 데이터가 표시됩니다.

누구든지 전에이 문제가 있었는지 알고 싶습니까? 분명히 클라이언트에게 원래 보낸 데이터를 변경하도록 클라이언트에 요청할 수 있지만 탭으로 구분 된 파일을 생성하는 데 사용하는 자동화 된 프로세스입니다. 차라리 최후의 수단으로 사용하고 싶습니다.

필자는 표준 TextReader를 사용하여 파일을 열어서 따옴표를 이스케이프 처리하고 내용을 새 파일에 다시 작성한 다음 해당 파일을 CSV Reader에 공급할 수 있다고 생각했습니다. 탭으로 구분 된 파일의 평균 파일 크기는 약 40MB입니다.

도움을 주시면 대단히 감사하겠습니다. 건배, 숀

답변

0

redbull의 늦은 밤 직후에 내 머리를 긁어서, 결국 문제를 발견했습니다. "Claim_Description"필드에 쉼표가있었습니다. 탭으로 구분 된 파일을 사용하고 있기 때문에 생각조차하지 못했지만, 파일의 모든 쉼표를 찾아서 바꿔 버리면 바로 작동했습니다.

다음 단계는 처리하기 전에 해당 쉼표를 바꾸는 방법을 찾는 것입니다.

다시 한 번 제안 해 주셔서 감사합니다.

는 건배, 숀

2

대신 FileHelpers 라이브러리를 사용합니다. 널리 사용되며 따옴표로 묶인 필드 또는 따옴표가있는 필드를 처리합니다.

+1

이 볼 -> http://www.secretgeek.net/csv_trouble.asp – IanL

+2

@Oded을 : 문제는 인용 필드에 대처하는 방법을 요구하지 않습니다. 따옴표 문자가 포함 된 인용되지 않은 * 필드에 대해 묻습니다. – LukeH

+0

@ 루크 : 음. 나는 진짜 CSV "표준"이 없다는 점에서 당신과 의견이 달리하기 시작했습니다. 나는 그것을 위해 RFC를 찾았지만, 당신이 그것에 따라 맞아 보인다. –

2

확인 따옴표에 대한 CodeProject의 기사에 코멘트 :

http://www.codeproject.com/Messages/3382857/Re-Quotes-inside-of-the-Field.aspx 당신은 "외에 다른 문자를 원하는 생성자에서 지정해야

따옴표로 사용되는

+0

+1 이것은 당신이해야 할 일입니다. '''가 CSV의 다른 곳에 인용 문자로 사용되면, 파일은 일관성이없고 깨끗한 해결책이 없습니다 –

0

어쩌면 파일을 응용 프로그램에서 열고 각 인용 부호를 다른 문자로 바꾼 다음 처리 할 수 ​​있습니다.

0
좀 검색을했다

, 거기 CSV 파일에 대한 RFC (RFC 4180)입니다, 그리고 명시 적으로 그들이 무엇을하고 있는지 금지 않습니다 그러나 (

각 필드 또는 큰 따옴표로 묶어야하지 않을 수도 있습니다 Microsoft Excel과 같은 일부 프로그램에서는 큰 따옴표 을 사용하지 않습니다.필드가 큰 따옴표로 묶이지 않으면 큰 따옴표가 필드 내에 나타나지 않을 수 있습니다. 그들이 그렇게 할 경우

Basicly는, 그들은 따옴표로 그 전체 필드를 둘러싸과 같이해야합니다 : 당신은 당신이 그들을 다시이 문제를 던질 수 싶다면

,""SUMISEI MARU NO 2" - sea of Japan", 

그들이 주장 "적절한"RFC 4180 CSV 파일을 보내십시오.

해당 CSV 리더의 소스 파일에 액세스 할 수 있으므로 다른 옵션은 피드를 제공하는 인용 된 문자열의 종류를 처리하도록 수정하는 것입니다.

이런 상황에서 툴셋에 대한 소스 코드 액세스가 필수적입니다.

공구를 사용하기 전에 파일을 사전 처리 (해킹)하려는 경우 올바른 방법은 인용 부호가있는 입력란을 구분 기호의 바로 앞에 또는 뒤에 표시하지 않고 전체를 묶는 것입니다 다른 따옴표 집합의 필드.

1

나는 최근에 비슷한 문제를 해결하고, CsvReader 모두에서 제대로 작동하지만되었지만 결국 내 문제를 해결 무엇을 내 TSV 파일의 몇 줄의 생성자에서 customDelimiter을 설정했다 CsvReader

public static void ParseTSV(string filepath) 
    { 
     using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t')) { 
     //if that didn't work, passing unlikely characters into the other params might help 
     //using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t', '~', '`', '~', ValueTrimmingOptions.None)) { 
      int fieldcount = csvReader.FieldCount; 

      //Does not work, since it's read only property 
      //csvReader.Delimiter = "\t"; 

      string[] headers = csvReader.GetFieldHeaders(); 

      while (csvReader.ReadNextRecord()) { 
       for (int i = 0; i < fieldcount; i++) { 
        string msg = String.Format("{0}\r{1};", headers[i], 
               csvReader[i]); 
        Console.Write(msg); 
       } 
       Console.WriteLine(); 
      } 
     } 
    } 
관련 문제