CSV 파일 인코딩 오류를 읽습니다
-
10-07-2019 - |
문제
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
등), 그러나 사전롤 파서가 사용할 가치가있는 충분한 에지 사례가 있습니다.
제휴하지 않습니다 StackOverflow