문제

CSV 파일 콘텐츠를 읽는 데 다음 방법을 사용하고 있습니다.

    /// <summary>
    /// Reads data from a CSV file to a datatable
    /// </summary>
    /// <param name="filePath">Path to the CSV file</param>
    /// <returns>Datatable filled with data read from the CSV file</returns>
    public DataTable ReadCsv(string filePath)
    {
        if (string.IsNullOrEmpty(filePath))
        {
            log.Error("Invalid CSV file name.");
            return null;
        }

        try
        {
            DataTable dt = new DataTable();

            string folder = FileMngr.Instance.ExtractFileDir(filePath);
            string fileName = FileMngr.Instance.ExtractFileName(filePath);
            string connectionString = 
            string.Concat(@"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=",
            folder, ";");

            using (OdbcConnection conn = 
                   new System.Data.Odbc.OdbcConnection(connectionString))
            {
                string selectCommand = string.Concat("select * from [", fileName, "]");
                using (OdbcDataAdapter da = new OdbcDataAdapter(selectCommand, conn))
                {
                    da.Fill(dt);
                }
            }

            return dt;
        }
        catch (Exception ex)
        {
            log.Error("Error loading CSV content", ex);
            return null;
        }
    }

이 메소드는 내가있는 경우 작동합니다 UTF-8 인코딩 된 CSV 파일 a schema.ini 다음과 같이 보입니다.

[Example.csv]
Format=Delimited(,)
ColNameHeader=True
MaxScanRows=2
CharacterSet=ANSI

CSV 파일에 독일 문자가있는 경우 유니 코드 인코딩, 메소드는 데이터를 올바르게 읽을 수 없습니다.

위의 방법을 읽을 수있는 수정 사항은 무엇을 읽을 수 있습니까? 유니 코드 CSV 파일? 이런 식으로 할 수있는 방법이 없다면 어떤 CSV 판독 코드를 제안 할 수 있습니까?

도움이 되었습니까?

해결책

사용해보십시오 CharacterSet=UNICODE schema.ini 파일에서. 이것은 아니지만 MSDN에 문서화되었습니다 이것에 따라 작동합니다 Microsoft 포럼의 스레드.

다른 팁

글쎄, 아주 훌륭하고 잘 사용되는 스트리밍 CSV 리더 CodeProject에 있습니다; 그것이 내가 시도해 볼 첫 번째 일입니다 ...하지만 인코딩이 borked 될 수있는 것처럼 들립니다. 단순하게 만들지 않을 수도 있습니다 ... 물론, 그것은 단지 깨지는 ODBC 일 수 있습니다. 위의 경우 작동 할 수 있습니다. 좋아.

간단한 CSV의 경우 직접 구문 분석 할 수 있습니다 (string.Split 등), 그러나 사전롤 파서가 사용할 가치가있는 충분한 에지 사례가 있습니다.

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