2009-07-09 31 views
15

thể trùng lặp:
CSV File Imports in .NetCó cách nào "thích hợp" để đọc file CSV

Trong .net, là có một thư viện chuẩn nên được sử dụng để đọc trong các tập tin csv ? Tất cả các mẫu trên web đều cuộn đầu đọc/phân tích cú pháp csv của riêng chúng hoặc sử dụng OleDb.

Nó không phải là một vấn đề khi sử dụng bất kỳ giải pháp nào, tôi chỉ tự hỏi nếu có một thư viện được chấp nhận chung (không phải là tôi có thể tìm thấy), hay cách nào khác "thích hợp" để làm điều đó?

Trả lời

18

CsvReader là một sản phẩm khá hay ... nó không phải là Microsoft, nhưng nó hoạt động rất tốt và nhanh hơn rất nhiều so với một số lựa chọn thay thế (di sản OleDb vv).

+0

Đây là thư viện tốt nhất tôi có thể tìm thấy. Tôi đã phải sửa chữa một vài lỗi trong nó liên quan đến hỗ trợ tối nghĩa hơn cho những điều nhất định nhưng nó là tốt trên các công cụ tiêu chuẩn. CNTT có phần không hiệu quả ở chỗ nó lặp lại chuỗi lặp lại. Với một chút cải tạo, tôi đã thay đổi nó để sử dụng StringBuilder trong vòng lặp chính cho hầu hết các trường hợp và cung cấp cho bạn tốc độ tăng nhanh – ShuggyCoUk

+0

Có, tôi đang điều tra nó vào lúc này - dường như xử lý rất nhiều trường hợp cạnh. Có vẻ như không có gì khác giống như nó. – Gareth

+7

Tôi thực sự sẽ xem các chàng trai có muốn thay đổi mã của tôi thay vì cố gắng tự duy trì nó không ... – ShuggyCoUk

0

Tôi chắc rằng bạn có thể đọc tệp CSV thành một DataTable với một dòng mã. Khi đã ở trong DataTable, bạn có thể sắp xếp, lọc, lặp lại, v.v.

This question có một số ví dụ để đọc CSV thành DataTables.

+0

Tôi đã đi xuống con đường này nhiều lần. Khi nó hoạt động, nó hoạt động tốt - nhưng gỡ lỗi các vấn đề khi nó không hoạt động là một nỗi đau lớn. – aSkywalker

+0

Huh? Các vấn đề duy nhất mà tôi từng gặp phải với tệp CSV là với chính dữ liệu (dấu phẩy thừa, dấu ngoặc kép, vv) và những vấn đề đó sẽ là vấn đề bất kể bạn sử dụng phương pháp phân tích cú pháp nào. – MusiGenesis

+1

vâng, vấn đề hầu như luôn luôn với dữ liệu - nhưng ở đâu trong dữ liệu? Chúng tôi bắt đầu chuyển sang lớp TextFieldParser ở mọi điểm (hàng trăm) vì những hạn chế và thiếu kiểm soát mà nó đưa ra. Đã làm việc 90% thời gian, nhưng khi nó không có thì không có sự trợ giúp nào được cung cấp trong lỗi. Chúng tôi tạo ra một thư viện lớp để làm việc xung quanh điều này - chà dữ liệu thô đầu tiên vv ... Nếu bạn chưa thử lớp TextFieldParser bạn thực sự cần - chúng tôi yêu thích nó - và phân tích hàng triệu hàng dữ liệu csv mỗi tháng – aSkywalker

9

Một trong những lý do khiến nhiều người tự viết là CSV không hoàn toàn đơn giản như vậy. Ví dụ:

  1. Hàng đầu tiên có chứa tên trường hay không?
  2. Bạn có hỗ trợ ngày không? Nếu, như vậy, chúng được trích dẫn, được bao quanh bởi # nhãn hiệu, theo một thứ tự nhất định trong tháng-tháng?
  3. Công cụ hỗ trợ linefeeds có xảy ra bên trong giá trị văn bản được trích dẫn không? Hay điều đó có chia nhỏ kỷ lục?
  4. Làm cách nào để thoát khỏi báo giá bên trong chuỗi được trích dẫn? Bạn có tăng gấp đôi câu trích dẫn hoặc sử dụng dấu gạch chéo ngược hoặc ký tự thoát khác không?
  5. Mã hóa ký tự nào được hỗ trợ?
  6. Làm cách nào để xử lý các ký tự điều khiển thoát? & #XX; hoặc \ uXXXX hoặc một số phương pháp khác?

Đây là những một số trong những lý do người viết phân tích cú pháp riêng của họ, bởi vì họ đang file đọc gặp khó khăn tạo ra với tất cả các thiết lập khác nhau. Hoặc họ viết serializers của riêng mình, bởi vì hệ thống đích có một loạt các idiosyncrasies.

Nếu bạn không quan tâm đến những vấn đề này, chỉ cần sử dụng thư viện tiện lợi nhất. Nhưng hiểu họ đang ở đó.

+11

Tất cả những âm thanh này là lý do chính đáng * không * để viết của riêng bạn, trừ khi bạn muốn lặp lại những sai lầm giống như những người khác đã thực hiện (và có thể đã sửa). – LukeH

+1

Trình đọc CSV sẽ cung cấp danh sách các hàng chứa chuỗi hoặc một lần lặp tương ứng; cách ngày/số/bất kỳ thứ gì được lưu trữ bên trong trường CSV là mối quan tâm của một lớp khác trong ứng dụng không phải nguyên khối. Các điểm khác là tất cả các lý do chính đáng để có gói đọc và viết CSV, KHÔNG phải để tự làm. Nhiều nỗ lực DIY phát minh lại bánh xe như một đa giác với ít hơn 6 mặt và không có trục :-) –

+0

Tôi đồng ý. Đây là lý do tại sao tôi đã khuyến khích mọi người * không * để viết riêng của họ, hoặc nếu họ * có *, để suy nghĩ về các vấn đề. – lavinio

2

Sau khi một số nghiên cứu kỹ hơn, đó cũng là điều này: http://www.filehelpers.com/

Có vẻ như một khuôn khổ toàn xung quanh đọc tác phẩm, và không hỗ trợ file csv.

(lưu ý: chỉ cần đọc nội dung trên các trang web, đã không sử dụng nó chưa)

10

Các namespace VB có một lớp lớn TextFieldParser. Tôi biết, C# mọi người không thích tham khảo một thư viện từ ngôn ngữ 'cơ bản' đó, nhưng nó khá tốt.

Nó nằm ở Microsoft.VisualBasic.FileIO.TextFieldParser

tôi sử dụng để gây rối với OLEDB, tạo ra các file định nghĩa cột vv - nhưng tìm ra TextFieldParser một công cụ rất đơn giản và tiện dụng cho phân tích bất kỳ tập tin kích thước xác định.

+3

Vâng, tôi cũng thích lớp này ...nhưng tôi thực sự tự hỏi tại sao MS đặt nó trong một hội đồng cụ thể VB, nó không có ý nghĩa gì cả! –

+8

@Thomas: Các lập trình viên VB mong đợi các hàm phân tích chuỗi dễ sử dụng, trong khi các lập trình viên kiểu C mong đợi phải chịu đựng khủng khiếp khi nói đến các chuỗi. – MusiGenesis

+2

Tôi vừa mới phát hiện ra lớp học này, và đó chỉ là những gì tôi đang tìm kiếm. Nó được xây dựng trong, đơn giản để sử dụng và xử lý các trường được phân cách bằng dấu ngoặc kép. Tôi khuyên bạn nên sử dụng nó cho những lần bạn không cần một giải pháp phức tạp, đặc biệt là khi làm việc trong một môi trường không phải là rất mở cho các thư viện của bên thứ ba. –

1

KBCsv là một tùy chọn khác, đặc biệt nếu bạn yêu cầu hiệu quả và khả năng làm việc với các tệp CSV lớn.

Tiết lộ: Tôi đã viết KBCsv, vì thế mà "KB";)

6

Hãy thử CsvHelper (thư viện tôi duy trì). Nó cũng có sẵn qua NuGet.

CsvHelper cho phép bạn đọc tệp CSV trực tiếp vào lớp tùy chỉnh của mình.

var streamReader = // Create a reader to your CSV file. 
var csvReader = new CsvReader(streamReader); 
List<MyCustomType> myData = csvReader.GetRecords<MyCustomType>(); 

CsvReader sẽ tự động tìm ra cách khớp tên thuộc tính dựa trên hàng tiêu đề (có thể định cấu hình được). Nó sử dụng cây biểu hiện biên dịch thay vì phản ánh, vì vậy nó rất nhanh.

Nó cũng rất mở rộng và có thể định cấu hình.

+1

Có bất kỳ ví dụ nào về điều này vì tài liệu trên trang web của dự án là barebones! Tôi muốn đọc toàn bộ tệp trong và sau đó cho phép người dùng ánh xạ đầu đề vào danh sách thuộc tính mà tôi xác định – Andrew

+0

Hy vọng sẽ sớm chuyển sang wiki trong kho lưu trữ github. Cách trang web được tạo ra là một nỗi đau lớn; sử dụng lâu đài cát. Nếu bạn có câu hỏi cụ thể, hãy hỏi một câu hỏi SO mới. –

+0

Xem câu hỏi này: http://stackoverflow.com/questions/5496845/using-csvhelper-with-c-mvc-to-import-csv-files – Andrew

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