2015-01-19 6 views
1

C#을 통해 파이프로 구분 된 텍스트 파일을 데이터 세트로 가져 오려고합니다. 일부 열은 헤더를 가져 오지 않습니다.텍스트 파일에서 가져올 때 데이터 세트의 열이 누락 됨

  bool conversionStatus = true; 

     //instantiate new Excel Object 
     Application xlApp = new Application(); 
     _Workbook wb = null; 
     if (xlApp == null) 
     { 
      Console.WriteLine("Excel is not properly installed!!"); 
      Console.ReadLine(); 
      return false; 
     } 


     //OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(filePath) + "; Extended Properties = \"text;HDR=No;FMT=TabDelimited\""); 
     OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(filePath) + "; Extended Properties = \"text;HDR=No\""); 
     conn.Open(); 

     OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + Path.GetFileName(filePath), conn); 

     DataSet ds = new DataSet("Temp"); 
     adapter.Fill(ds); 
내 서식이처럼 보이는있는 schema.ini 파일에 설정되는

:

[Master.txt] 
Format=Delimited(|) 
ColNameHeader=False 
다음
Apple|Orange|Banana|Grape|Mango|Guava|Apricot|Pear|Peach 
0C025X0|530335|WEROERWORUWEORWEU||Misc.||0|1|0 

내 코드입니다 :

내 소스 데이터입니다

다음은 데이터 집합에서 데이터가 어떻게 표시되는지입니다.

enter image description here

일부 헤더가 포함되고있는 이유는 다른 사람이없는 동안

사람은 알고 있나요?

답변

2

나는 당신의 상황을 재현 할 수 있으며, 나는 그것이 샘플 name and type과 열 목록을 설정

[Master.txt] 
Format=Delimited(|) 
ColNameHeader=False 
Col1=Name1 Text Width 100 
Col2=Name2 Text Width 100 
Col3=Name3 Text Width 100 
Col4=Name4 Text Width 100 
Col5=Name5 Text Width 100 
Col6=Name6 Text Width 100 
Col7=Name7 Text Width 100 
Col8=Name8 Text Width 100 
Col9=Name9 Text Width 100 

schema.ini 파일을 변경하여 문제를 해결하는 것 같다 해결했다.

약간의 연구 끝에 필자는 누락 된 값이 충돌하는 유형의 값을 가진 열에 있음을 확인했습니다.

예를 들어, 열 F2는 첫 번째 줄에 ORANGE 단어를 포함해야하지만 다음 줄에는 숫자가 포함되어 있으며 누락 된 값이있는 다른 모든 열에서도 마찬가지입니다. 그래서 Text Driver는 열에 숫자 형식을 제공하기로 결정했으며 당연히 해당 열의 문자열 값을 나타낼 수 없다고 생각합니다.

adapter.Fill(ds); 
DataTable dt = ds.Tables[0]; 
Console.WriteLine(dt.Columns["F2"].DataType); // prints Int32 

빙고 :
지금 나는 당신의 코드에 다음 줄을 추가 한이 이론을 확인합니다. 드라이버가 F2 열의 DataType Int32를 선택 했으므로 ORANGE 단어를 표시 할 수 없습니다.

실제 스키마를 수정하려면 실제 컬럼 값 사이의 모호함을 피하기 위해 schema.ini에 해당 데이터 유형의 컬럼 이름을 추가 할 수 있습니다.

+0

정말 고마워. 그건 완전히 트릭을 했어! – kickinchicken