2010-01-26 34 views
8

Chúng tôi có tệp văn bản với khoảng 100.000 hàng, khoảng 50 cột mỗi hàng, hầu hết dữ liệu là khá nhỏ (5 đến 10 ký tự hoặc số).Cách tốt nhất để đọc tệp văn bản được phân tách bằng tab trong C#

Đây là một nhiệm vụ khá đơn giản, nhưng chỉ cần biết cách tốt nhất là nhập dữ liệu này vào cấu trúc dữ liệu C# (ví dụ DataTable) là gì?

+0

Đối với 100.000 hàng, có thể bạn không muốn tải nó vào một DataTable. Bạn có thể muốn xem xét sử dụng SqlBulkCopy khi bạn chèn nó vào cơ sở dữ liệu. –

Trả lời

9

tôi sẽ đọc nó như là một CSV với delimiters cột tab:

A Fast CSV Reader

Edit:
Dưới đây là một ví dụ barebones những gì bạn cần:

DataTable dt = new DataTable(); 
using (CsvReader csv = new CsvReader(new StreamReader(CSV_FULLNAME), false, '\t')) { 
    dt.Load(csv); 
} 

Trong đó CSV_FULLNAME là đường dẫn đầy đủ + tên tệp CSV được phân tách bằng tab của bạn.

+0

Chúng tôi sử dụng trình đọc CSV này trong ứng dụng của chúng tôi, thật tuyệt vời. –

+0

Tôi sẽ kiểm tra xem nó ra, bất cứ ai xảy ra để có mã mẫu để sử dụng nó với delimiters cột tab? – alchemical

+0

Tôi khuyên bạn nên làm như thế này. Bạn cũng có thể sử dụng trình điều khiển Access/Jet để truy cập ADO.Net, nhưng đôi khi có một chút quirkiness ở đó. – Tracker1

0

Hai lựa chọn:

  1. Sử dụng các lớp trong namespace System.Data.OleDb. Điều này có lợi thế là đọc trực tiếp vào một datatable như bạn hỏi với mã rất ít, nhưng nó có thể được khôn lanh để có được đúng bởi vì nó là tab chứ không phải là dấu phẩy phân cách.
  2. Sử dụng hoặc viết trình phân tích cú pháp csv. Hãy chắc chắn rằng nó là một trình phân tích cú pháp dựa trên máy nhà nước giống như trình phân tích cú pháp @Jay Riggs được liên kết với hơn là một trình phân tích cú pháp dựa trên String.Split(). Điều này sẽ nhanh hơn phương pháp OleDb, nhưng nó sẽ cung cấp cho bạn một List hoặc array chứ không phải là một datatable.
+0

Chỉ cần tò mò tại sao bạn đề xuất một trình phân tích cú pháp dựa trên trạng thái trái ngược với String.Split(). –

+0

Hiệu suất, chủ yếu. Nhưng cũng rất khó để có được những thứ như trích dẫn văn bản ngay với string.split. –

+0

Ngoài ra, bằng "máy trạng thái" tôi _don't_ có nghĩa là Regex, mà chỉ là về xấu. Tôi có nghĩa là một máy nhà nước mục đích xây dựng cho nhiệm vụ này có thể xử lý tốt hơn gốc/đệ quy. –

1

Còn về FileHelpers, bạn có thể xác định tab làm dấu phân tách. HEad trên để trang web đó bằng liên kết được cung cấp và có một peeksy.

Hy vọng điều này sẽ giúp, Trân trọng, Tom.

0

Tuy nhiên bạn phân tích cú pháp các dòng, hãy đảm bảo bạn sử dụng thứ gì đó hỗ trợ chuyển tiếp và tua lại, là nguồn dữ liệu của lưới dữ liệu của bạn. Bạn không muốn tải mọi thứ vào bộ nhớ trước, phải không? Nếu số lượng dữ liệu phải gấp mười lần trong lần tiếp theo thì sao? Làm cho một cái gì đó sử dụng file.seek sâu, không đọc tất cả mọi thứ vào bộ nhớ đầu tiên. Đó là lời khuyên của tôi.

0

đơn giản, nhưng không phải nhất thiết là một cách tuyệt vời:

  • đọc các tập tin sử dụng bộ đọc dữ liệu vào một chuỗi

  • Sử dụng String.split để có được các hàng

  • sử dụng String.Split có ký tự tab để nhận giá trị trường

+0

chỉ để nhắc nhở về nó - có chuỗi [] System.IO.File.ReadAllLines (chuỗi đường dẫn) –

3

Sử dụng trình phân tích cú pháp được tích hợp sẵn của .NET. Nó là miễn phí, có xử lý lỗi tuyệt vời, và giao dịch với rất nhiều trường hợp bóng lẻ.

http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser(VS.80).aspx

+0

Đây có phải là VB không? – alchemical

+3

Không, nó chỉ xảy ra trong không gian tên VB vì nhóm đó đã xây dựng nó. Bạn có thể sử dụng nó từ bất kỳ ngôn ngữ .NET nào. –

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