2009-09-22 27 views
24

tôi dường như không thể đọc tệp .csv bằng cách sử dụng chuỗi kết nối sau:c tập tin # đọc csv không đưa ra một đường dẫn hợp lệ

var fileName = string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "Uploads\\countrylist.csv"); 
string connectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=""text;HDR=YES;FMT=Delimited""", fileName); 
OleDbConnection oledbConn = new OleDbConnection(connectionString); 
oledbConn.Open(); 

Nó cung cấp cho các lỗi sau:

'D:\arrgh\arrgh\Uploads\countrylist.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.

tôi đã xác minh rằng tệp có ở đó. Chuyện gì đang xảy ra ở đây?

Trả lời

51

Ok, tôi đào một chút nữa và có vẻ như chuỗi kết nối của tôi là sai. Với tệp CSV, bạn không chỉ định tên tệp thực nhưng thư mục chứa tệp đó, ví dụ:

var fileName = string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "Uploads\\"); 
string connectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=""text;HDR=YES;FMT=Delimited""", fileName); 
OleDbConnection oledbConn = new OleDbConnection(connectionString); 
oledbConn.Open(); 
var cmd = new OleDbCommand("SELECT * FROM [countrylist.csv]", oledbConn); 

Và bạn chỉ định tên tệp trong SelectCommand. Thật là một cách làm lạ. Nó làm việc cho tôi bây giờ.

+6

Cũng lưu ý rằng nếu bạn đang sử dụng trình điều khiển Microsoft Jet OLEDB để đọc tệp CSV, bạn sẽ không thể đọc bất kỳ tệp CSV nào có nhiều hơn một dấu chấm trong tên tệp của nó. Tức là, "filename.csv" sẽ hoạt động, nhưng "file.name.csv" sẽ không hoạt động. –

+0

Và lưu ý rằng bạn muốn sử dụng 'sql = SELECT * FROM myfile.csv' (tức là tên tệp không có đường dẫn). Bạn có thể trích xuất tên tệp từ đường dẫn đầy đủ bằng cách sử dụng 'csvFile = Right (csvPath, Len (csvPath) - InStrRev (csvPath," \ "))' –

+4

@ TommyO'Dell hoặc đơn giản là 'Path.GetFileName (csvPath)' –

2

Cách kết hợp đường dẫn và tên tập là sử dụng:

fullFilename = System.IO.Path.Combine(folderfilepath, Filename); 

trong ví dụ của bạn:

var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Uploads\countrylist.csv"); 
+0

nope, điều đó không làm việc cũng – sean

+1

@seanlinmt: Đó không phải là vấn đề duy nhất của bạn, nhưng đây là những lời khuyên rất âm thanh. * Không bao giờ * thực hiện thao tác đường dẫn dưới dạng chuỗi - luôn sử dụng các hàm trợ giúp 'System.IO.Path'. Nếu không, sẽ luôn có trường hợp cạnh đó cắn bạn. –

0

Nếu ổ đĩa D là một ổ đĩa mạng được ánh xạ sau đó bạn có thể cần phải sử dụng đường dẫn UNC:

\\computerName\shareName\path\ 
1

tôi đã cùng một vấn đề một vài tuần trước cố gắng để làm một số Office 2007 tự động và dành quá nhiều thời gian cố sửa nó.

string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1;\""; 
4

Tôi khuyên bạn nên sử dụng trình phân tích cú pháp CSV thay vì sử dụng nhà cung cấp dữ liệu OLEDB.

Tìm kiếm và bạn sẽ tìm thấy nhiều ứng viên (miễn phí). Dưới đây là một vài mà làm việc cho tôi:

A portable and efficient generic parser for flat files (đơn giản nhất để sử dụng, IMO)
A Fast CSV Reader (dễ sử dụng, rất tốt cho tập dữ liệu lớn)
FileHelpers thư viện (linh hoạt, bao gồm máy phát điện mã, chút của một học tập Thông thường, chúng sẽ cho phép bạn chỉ định các thuộc tính của CSV (dấu phân tách, tiêu đề, định dạng văn bản, v.v.) và với một phương thức gọi CSV của bạn được bán cho một cấu trúc dữ liệu nào đó, chẳng hạn như một DataTable hoặc Danh sách <>.

Nếu bạn đang làm việc hoàn toàn với CSV, bạn nên kiểm tra trình phân tích cú pháp CSV.

+3

Tôi đã sử dụng "Trình đọc CSV nhanh", rất tuyệt. –

+1

Mặc dù tôi đồng ý rằng việc sử dụng trình phân tích cú pháp CSV có thể là giải pháp tốt nhất (xem câu trả lời của tôi cho giải pháp thay thế thực sự được tích hợp sẵn trong .NET Framework), có thể có trường hợp sử dụng trình điều khiển Microsoft Jet OLEDB. Một thuộc tính hữu ích là nó có thể phát hiện các kiểu dữ liệu của các cột CSV mà tôi đã sử dụng trong quá khứ khi viết mã để dịch các tệp CSV sang một định dạng khác (DBF trong trường hợp của tôi). –

+0

@Daniel - Thú vị về nhà cung cấp OLEDB, tôi không biết điều đó. Tôi không chắc chắn tôi muốn sử dụng tính năng này mặc dù, thích đặt rõ ràng (và kiểm tra) những điều này bản thân mình. Cảm ơn bạn về thông tin. –

2

Nếu bạn chỉ đang cố gắng đọc tệp CSV bằng C#, điều dễ nhất là sử dụng lớp Microsoft.VisualBasic.FileIO.TextFieldParser. Nó thực sự được tích hợp vào .NET Framework, thay vì là phần mở rộng của bên thứ ba.

Có, nó nằm trong Microsoft.VisualBasic.dll, nhưng điều đó không có nghĩa là bạn không thể sử dụng nó từ C# (hoặc bất kỳ ngôn ngữ CLR nào khác).

Dưới đây là một ví dụ về việc sử dụng, lấy từ MSDN documentation:

Using MyReader As New _ 
Microsoft.VisualBasic.FileIO.TextFieldParser("C:\testfile.txt") 
    MyReader.TextFieldType = FileIO.FieldType.Delimited 
    MyReader.SetDelimiters(",") 
    Dim currentRow As String() 
    While Not MyReader.EndOfData 
     Try 
     currentRow = MyReader.ReadFields() 
     Dim currentField As String 
     For Each currentField In currentRow 
      MsgBox(currentField) 
     Next 
     Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException 
     MsgBox("Line " & ex.Message & _ 
     "is not valid and will be skipped.") 
     End Try 
    End While 
End Using 

Một lần nữa, ví dụ này là trong VB.NET, nhưng nó sẽ là tầm thường để dịch nó sang C#.

Các vấn đề liên quan