2013-09-05 2 views
1

필자는 탭으로 구분 된 텍스트 파일을 가지고 있는데, 소수점 값은 0,12 (소수점 구분 기호로 쉼표)로 형식이 지정됩니다. Provider = Microsoft.Jet.OLEDB.4.0을 통해 해당 내용을 OleDBDataReader에 구문 분석하지만 결과를 보면 10 진수이어야하는 값이 DateTime으로 변환되었습니다!OleDbDatareader 10 진수

숫자에 대한 소수 구분 기호로 쉼표를 이해하도록 응용 프로그램에 강제 적용하는 방법은 무엇입니까? cultureinfo를 en-US 또는 다른 언어로 변경하지 않았습니다.

public static OleDbDataReader CriarOleDbDataReader(string sCaminhoArquivo) 
    { 
     FileInfo fi = new FileInfo(sCaminhoArquivo); 

     string format; 

     string linha; 

     if (fi.Extension.ToLower().Equals(".csv")) 
     { 
      string texto = System.IO.File.ReadAllText(sCaminhoArquivo).Replace(',', ';'); 
      System.IO.File.WriteAllText(sCaminhoArquivo, texto); 
      linha = System.IO.File.ReadAllLines(sCaminhoArquivo)[0]; 
      format = "Delimited(;)"; 
     } 
     else 
     {     
      linha = System.IO.File.ReadAllLines(sCaminhoArquivo)[0]; 
      format = (linha.Split('\t').Count() > 1) ? "TabDelimited" : "Delimited(;)"; 
     } 

     DefinirSchema(fi, format); 

     string cn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fi.DirectoryName + ";Extended Properties='text;HDR=Yes';"; 

     OleDbConnection con = new OleDbConnection(cn); 
     OleDbCommand cmd = new OleDbCommand("select * from [" + fi.Name + "]", con); 
     OleDbDataReader dr; 

     con.Open(); 

     dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

     return dr; 

    } 

"IOF"필드는 10 진수이며 .txt 파일의 값은 0,02이지만 datetime을 반환합니다.

dr["iof"] 
{30/12/1899 00:02:00} 
    Date: {30/12/1899 00:00:00} 
    Day: 30 
    DayOfWeek: Saturday 
    DayOfYear: 364 
    Hour: 0 
    Kind: Unspecified 
    Millisecond: 0 
    Minute: 2 
    Month: 12 
    Second: 0 
    Ticks: 599264353200000000 
    TimeOfDay: {00:02:00} 
    Year: 1899 

답변

0

"강제로"내 응용 프로그램이 숫자의 소수 구분 기호로 쉼표를 이해하도록 ""설정하는 방법 "

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR"); 
decimal val = decimal.Parse("0,02"); 

위의 코드는 10 진수 값 0.02를 생성합니다.

+0

하지만 데이터 변환기가 데이터로 채워진 후에 변환하고 싶지 않습니다. executereader를 올바른 값으로 채우고 싶습니다. – Lombardo

+0

그러면'select * '대신에 다음과 같이하면됩니다 :'select functionConvertToDecimal (decimalField), anotherField, ... from ...' –

0

당신은 이들 중 하나가 필요

1.

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture ("소수가 가리 키지 쉼표로 구분 모든 문화");

    당신은

    decimal.Parse("0,02").Split(",").Join(".")) 
    

    3.

    귀하의 파일 탭 - 의사 코드가 아닌 정확한 구문입니다 미국 문화에 있다면 구분됩니다. 스트림을 사용하여 OleDb 대신 데이터 테이블에로드하십시오.

    +0

    1 - 작동하지 않았습니다. 2 - 전에 말했듯이 값은 올바른 형식으로 반환되어야하므로 늦은 변환은 삭제됩니다. 3 - Datatable은 원래의 솔루션이었고 작동 중이었습니다 (끔찍하고 끔찍한 성능). 그러나 파일이 300.000 라인을 초과하면 "OutOfMemoryException"을 던져서 데이터 테이블을 버렸다. – Lombardo

    +0

    다시 읽으십시오. 메시지가 표시되지 않았습니다. 쉼표가 소수점 구분 기호 인 문화권을 설정 했습니까? 서비스를 만들고 SQL Server에 파일을로드하고 거기에서 작업 할 수 있습니다. –

    1

    방금 ​​해결되었습니다. 파일의 각 열에 대해 데이터 유형을 결정하려고하는 schema.ini 파일에 더 많은 행을 추가해야했습니다.

    ColNameHeader =

    0 희망은 도움이 =

    MAXSCANROWS 사실 : 알았어요 here

    이 두 아기 트릭을했다.