2011-07-25 68 views
20

我知道這個話題已經完成,但我已經完成了。使用C#使用OleDb解析CSV

我需要解析csv。這是一個相當平均CSV和分析邏輯已經使用OLEDB其他開發誰發誓,這他在休假:)去工作之前寫

CSV sample: 
Dispatch Date,Master Tape,Master Time Code,Material ID,Channel,Title,Version,Duration,Language,Producer,Edit Date,Packaging,1 st TX,Last TX,Usage,S&P Rating,Comments,Replace,Event TX Date,Alternate Title 
,a,b,c,d,e,f,g,h,,i,,j,k,,l,m,,n, 

我的問題是,我得到不同的連接上各種錯誤字符串我嘗試。

當我嘗試連接字符串:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source="D:\TEST.csv\";Extended Properties="text;HDR=No;FMT=Delimited" 

我得到的錯誤:

'D:\TEST.csv' is not a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides. 

當我嘗試連接字符串:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\TEST.csv;Extended Properties=Excel 12.0; 

或連接字符串

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TEST.csv;Extended Properties=Excel 8.0; 

我得到的錯誤:

External table is not in the expected format. 

我正在考慮扔掉所有的代碼,並從頭開始。有什麼明顯的我做錯了嗎?

回答

33

您只應在連接字符串中指明目錄名稱。該文件的名稱將被用於查詢:

var filename = @"c:\work\test.csv"; 
var connString = string.Format(
    @"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=YES;FMT=Delimited""", 
    Path.GetDirectoryName(filename) 
); 
using (var conn = new OleDbConnection(connString)) 
{ 
    conn.Open(); 
    var query = "SELECT * FROM [" + Path.GetFileName(filename) + "]"; 
    using (var adapter = new OleDbDataAdapter(query, conn)) 
    { 
     var ds = new DataSet("CSV File"); 
     adapter.Fill(ds); 
    } 
} 

而不是OLEDB,你可以使用一個decent CSV parser(或another one)。

+0

我不能非常感謝你!你能指點我一些體面的csv解析器嗎?另外我可以在哪裏閱讀連接字符串?就像現在對我來說,它就像巫毒一樣。 –

+1

@Zulfi Tapia,在我的回答結尾處,我指出了2 *精美的* CSV解析器。 –

+0

非常感謝您的幫助! –

0

看來你的第一行包含列名,所以你需要包括HDR = YES屬性,像這樣:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\TEST.csv;Extended Properties="Excel 12.0;HDR=YES"; 
+0

是的,第一列是標題。 '外部表格未處於預期格式.'仍然 –

0

嘗試連接字符串:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TEST.csv;Extended Properties=\"Excel 8.0;IMEX=1\"" 
+0

nopes'外部表格未處於預期格式.'仍然... :) –

0
var [email protected]"D:\TEST.csv"; 
string dir = Path.GetDirectoryName(s); 
string sConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" 
         + "Data Source=\"" + dir + "\\\";" 
         + "Extended Properties=\"text;HDR=YES;FMT=Delimited\""; 
+0

這需要我過去前面提到的兩個錯誤,但由於我們直接查找在一個目錄中,我如何指定要拾取的文件? 它崩潰並告訴我'Microsoft Jet數據庫引擎找不到'TEST $ .txt'對象。確保對象存在,並且正確拼寫其名稱和路徑名.' –