Có bất kỳ trình đọc / người viết CSV nào trong C # không? [đóng cửa]


111

Có bất kỳ trình đọc / người viết CSV nào trong C # không?


68
Tôi có ý kiến ​​khác. Đây chắc chắn là một câu hỏi mang tính xây dựng và là kết quả đầu tiên trên google cho .net csv library. Bằng chứng, mặc dù chỉ là giai thoại, cho khẳng định của tôi là câu hỏi này đã được xem hơn 22000 lần trong sáu năm qua.
shovavnik

5
thật nói - hit đầu tiên trên google
Robetto

Câu trả lời:


107

Hãy thử CsvHelper . Nó dễ sử dụng như FastCsvReader và cũng có thể viết. Tôi đã rất hài lòng với FastCsvReader trong quá khứ, nhưng tôi cần một cái gì đó cũng có thể viết và không hài lòng với FileHelpers.

Đọc hiểu:

var csv = new CsvReader( stream );
var myCustomTypeList = csv.GetRecords<MyCustomType>();

Viết:

var csv = new CsvWriter( stream );
csv.WriteRecords( myCustomTypeList );

Tiết lộ đầy đủ: Tôi là tác giả của thư viện này.


3
Cảm ơn, Josh. Tôi đã thử điều này, nó vừa nhanh vừa tiết kiệm bộ nhớ. Tôi nghĩ rằng tài liệu có thể được cải thiện một chút cho những người dùng lần đầu tiên, nhưng nó chắc chắn là đủ.
Sam

Có cách nào để sử dụng thư viện này mà không có kiểu tùy chỉnh để tôi có thể chỉ cần lặp qua lưới bảng của mình (tùy chỉnh) và viết ra tiêu đề rồi chuyển từng trường hàng không? Tôi chỉ đang tìm cách ngăn lỗi trong tệp (thoát đúng cách, v.v.).
u84six

Đúng. Bạn có thể sử dụng WriteField. Kiểm tra tài liệu tại đây joshclose.github.io/CsvHelper
Josh Đóng

1
@Zimano Không đúng. Bạn có thể đọc các trường riêng lẻ hoặc thậm chí chỉ lấy một mảng chuỗi cho hàng. Kiểm tra tài liệu. joshclose.github.io/CsvHelper
Josh Đóng

@JoshClose Ồ, thật tuyệt khi nghe, cảm ơn! Tôi chỉ xem hướng dẫn bắt đầu ở đây: joshclose.github.io/CsvHelper/… và nó không bao gồm trường hợp sử dụng của tôi. Tôi nên nhìn xa hơn, xin lỗi. Tuy nhiên, trên trang đó có nói rằng sử dụng một số loại ánh xạ là cách được khuyến khích sử dụng CsvHelper. Có lẽ nó có thể cung cấp một số chiến lược đọc thay thế ngay tại chỗ? Tôi đã xóa nhận xét ban đầu của tôi bằng cách này, như nó bây giờ không thích hợp :-)
Zimano

21

Có một số tùy chọn, ngay trong chính khuôn khổ.

Một trong những cách dễ nhất là tham khảo Microsoft.VisualBasic, sau đó sử dụng TextFieldParser . Nó là một trình đọc CSV đầy đủ chức năng trong khuôn khổ cốt lõi.

Một giải pháp thay thế tốt khác là sử dụng bộ dữ liệu để đọc tệp CSV .


6
Tôi luôn tự hỏi tại sao nó lại nằm trong tập hợp Microsoft.VisualBasic ... MS có nghĩ rằng các nhà phát triển C # không sử dụng CSV không?
Thomas Levesque

4
@Thomas: đặc biệt là kể từ khi rất nhiều các nhà phát triển C # co rúm người lại khi nghĩ đến bao gồm một VisualBasic lắp ráp trong các dự án của họ

2
Vâng - có rất nhiều "món ngon" tốt đẹp trong đó. Tôi nghĩ rằng đó là nhiều hơn bởi vì VB có một số cấu trúc ngôn ngữ không thực sự được xem xét trong khuôn khổ ban đầu, nhưng họ sẽ không bao giờ có thể đưa người dùng VB6 đi qua mà không thực hiện chúng. Không gian tên Devices and ApplicationServices có tất cả những thứ hữu ích.
Reed Copsey

20
@ Roboto, bất kỳ nhà phát triển C # nào co rúm tham khảo Microsoft.VisualBasic trong dự án của họ là một kẻ hợm hĩnh về ngôn ngữ. Thậm chí tệ hơn là họ không hiểu .NET chút nào.
Ash

3
Một viên ngọc lắp ráp VB khác là CopyDirectory: stackoverflow.com/questions/58744/…

17

Sebastien Lorion có một CSVtrình đọc tuyệt vời trên CodeProject có tên là A Fast CSV Reader . Có lẽ là một trong những thứ tốt nhất cho C # và nó miễn phí.

Theo như cách viết, chỉ cần sử dụng StreamWriter.

Đây là một số mã soạn sẵn để ghi DataGridViewvào một tệp:

private void exportDGVToCSV(string filename)
{
    if (dataGridView1.Columns.Count != 0) 
    {    
        using (Stream stream = File.OpenWrite(filename))
        {
            stream.SetLength(0);
            using (StreamWriter writer = new StreamWriter(stream))
            {
                // loop through each row of our DataGridView
                foreach (DataGridViewRow row in dataGridView1.Rows) 
                {
                    string line = string.Join(",", row.Cells.Select(x => $"{x}"));
                    writer.WriteLine(line);
                }

                writer.Flush();
            }
        };
    }
}

2
Đó là sở thích của tôi. Thư viện nhỏ tuyệt vời.
Alex

2
Viết CSV rất dễ dàng - chỉ cần sử dụng phương thức xuất văn bản thông thường và phân tách bằng dấu phẩy. Bạn thực sự chỉ cần một handler thư viện / tùy chỉnh để đọc ...
Reed Copsey

10
@Reed: không quá tầm thường nếu bạn muốn thoát đúng dấu phẩy và dấu ngoặc kép. Tôi thậm chí không chắc liệu có tiêu chuẩn hóa cho điều này hay không, nhưng việc làm đó là rất phổ biến.
Stefan Steinegger

26
Viết CSV phức tạp hơn một chút. Nếu dữ liệu bạn muốn thể hiện trong tệp CSV chứa dấu phẩy hoặc dòng mới, bạn cần đặt dữ liệu trong dấu ngoặc kép. Nếu có một dấu ngoặc kép trong dữ liệu mới được đánh dấu ngoặc kép, thì bạn cần thoát khỏi dấu ngoặc kép bằng dấu ngoặc kép. Bạn chắc chắn có thể tự mình viết mã logic đó nhưng sẽ rất tuyệt nếu thư viện làm điều đó cho bạn.
Tinister

4
Tiêu chuẩn hóa là RFC 4180. tools.ietf.org/html/rfc4180
Josh Đóng

7

Có - mặc dù tôi cho rằng bạn đang thực sự hỏi chi tiết?

Dùng thử FileHelpers


Vâng, tôi đã làm nhưng vì một số lý do kỳ lạ mà FileHelpers bị hỏng một cách ngẫu nhiên. Hơn nữa, thư viện FileHelpers đã không được phát triển trong một thời gian dài.
Erik Schierboom

1
FileHelpers hiện đang được phát triển tích cực, hãy xem GitHub .
xmedeko

3

Có hàng chục.

http://www.filehelpers.net/ là một trong những trang phổ biến nhất.

Tôi nên nói rằng tôi thấy Trình trợ giúp tệp có hạn chế trong một số trường hợp và thay vào đó, hãy sử dụng Trình đọc CSV nhanh . Theo kinh nghiệm của tôi, nếu bạn không biết định dạng tệp CSV của mình hoặc ánh xạ nhập cho đến thời gian chạy - thì đây là thư viện tốt hơn để sử dụng.


Chúng tôi cũng sử dụng trình trợ giúp tệp.
Tangurena

1
Tôi nhận thấy FileHelpers là một điều phiền toái khi định cấu hình. FastCsvReader dễ sử dụng hơn rất nhiều.
Josh Đóng

+1 cho FastCsvReader. Màn biễu diễn quá xuất sắc. Nhưng nó chủ yếu là trình đọc / phân tích cú pháp. Không phải nhà văn.
Mehdi LAMRANI
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.