문제

탭으로 구분된 텍스트 파일을 열고 해당 데이터를 데이터베이스에 삽입하는 간단한 응용 프로그램이 있습니다.

저는 이 CSV 리더를 사용하여 데이터를 읽습니다. http://www.codeproject.com/KB/database/CsvReader.aspx

그리고 그것은 모두 잘 작동하고 있습니다!

이제 내 고객이 파일 끝에 "ClaimDescription"이라는 새 필드를 추가했으며 이러한 청구 설명 중 일부에는 데이터에 따옴표가 있습니다. 예:

"SUMISEI MARU NO 2" - 일본해

이로 인해 내 앱에 심각한 문제가 발생하는 것 같습니다.다음과 같은 예외가 발생합니다.

CSV가 '181' 위치의 레코드 '1470' 필드 '26 근처에서 손상된 것 같습니다.현재 원시 데이터:...

그리고 해당 "원시 데이터"에서 청구 설명 필드에는 따옴표가 포함된 데이터가 표시됩니다.

이전에 이 문제를 겪은 적이 있고 해결한 사람이 있는지 알고 싶습니다.분명히 클라이언트에게 원래 나에게 보낸 데이터를 변경하도록 요청할 수 있지만 이는 탭으로 구분된 파일을 생성하는 데 사용하는 자동화된 프로세스입니다.그리고 나는 그것을 최후의 수단으로 사용하고 싶습니다.

나는 미리 표준 TextReader를 사용하여 파일을 열고, 따옴표를 이스케이프 처리하고, 내용을 새 파일에 다시 쓴 다음, 해당 파일을 CSV 리더에 공급할 수 있을 것이라고 생각했습니다.탭으로 구분된 파일의 평균 파일 크기는 약 40MB라는 점을 언급할 가치가 있습니다.

어떤 도움이라도 대단히 감사하겠습니다!

건배, 션

도움이 되었습니까?

해결책 7

오른쪽 - Redbull의 늦은 밤과 머리를 긁은 후 결국 문제를 발견했습니다. 탭으로 변형 된 파일을 사용하고 있었기 때문에 그것에 대해 생각조차하지 않았지만 파일의 모든 쉼표를 찾아 교체하자마자 절대적으로 잘 작동했습니다!

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

다시 한 번 모든 제안에 감사드립니다.

건배, 숀

다른 팁

인용문에 대한 CodeProject 기사에 대한 의견을 확인하십시오.

http://www.codeproject.com/messages/3382857/re-quotes-inside-of-field.aspx

생성자에 "인용문으로 사용되기를 원하는 다른 문자를 지정해야합니다.

사용 파일 헬퍼 대신 도서관. 그것은 널리 사용되며 인용 된 필드 또는 인용문이 포함 된 필드에 대처할 것입니다.

최근에 비슷한 문제를 해결했으며 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();
            }
        }
    }

어쩌면 응용 프로그램으로 파일을 열고 각 인용문을 다른 문자로 바꾼 다음 처리할 수도 있습니다.

검색을했는데 CSV 파일에 대한 RFC가 있습니다 (RFC 4180), 그리고 그것은 그들이하고있는 일을 명시 적으로 금지합니다.

각 필드는 이중 인용문으로 둘러싸여 있거나 포함되지 않을 수 있습니다 (그러나 Microsoft Excel과 같은 일부 프로그램은 이중 인용문을 전혀 사용하지 않습니다). 필드가 이중 인용문으로 둘러싸여 있지 않은 경우 필드 내부에는 이중 인용문이 나타나지 않을 수 있습니다.

기본적으로, 그들이 그렇게하고 싶다면, 그들은 전체 필드를 따옴표로 동봉해야합니다.

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

따라서 원한다면이 문제를 다시 던져서 "적절한"RFC 4180 CSV 파일을 보낼 수 있습니다.

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

이러한 종류의 상황은 툴셋에 소스 코드에 액세스하는 것이 중요한 이유입니다.

대신 도구에 필기하기 전에 파일을 전처리 (해킹)하려면, 올바른 방법은 분리기 바로 앞이나 뒤에있는 견적이없는 필드를 찾아 다른 세트에서 전체 필드를 둘러싸는 것입니다. 인용문.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top