2009-09-10 41 views
29

Làm cách nào để đọc tệp CSV bằng C#?Đọc tệp CSV bằng .NET?

+6

http://stackoverflow.com/questions/1898/csv-file-imports-in-net http://stackoverflow.com/questions/938291/import-csv-file-into-c http://stackoverflow.com/questions/316649/csv-parsing http://stackoverflow.com/questions/1047531/splitting-comma-seperated-values-csv http : //stackoverflow.com/questions/1103495/is-there-a-proper-way-to-read-csv-files –

+3

[Top 6 cách để phân tích cú pháp .CSV? Hiệu suất cao!] (Http://izlooite.blogspot.com/2011/06/top-6-ways-to-parse-csv-high.html) –

Trả lời

1

Bạn có thể quan tâm đến thư viện Linq2Csv tại CodeProject. Một điều bạn sẽ cần phải kiểm tra là nếu nó đọc dữ liệu khi nó chỉ cần, vì vậy bạn sẽ không cần nhiều bộ nhớ khi làm việc với các tệp lớn hơn.

Để hiển thị dữ liệu trên trình duyệt, bạn có thể thực hiện nhiều việc, nếu bạn cụ thể hơn về yêu cầu của mình, câu trả lời có thể cụ thể hơn, nhưng bạn có thể làm như sau:
1. Sử dụng lớp HttpListener để viết máy chủ web đơn giản (bạn có thể tìm thấy nhiều mẫu trên mạng để lưu trữ máy chủ mini-http).
2. Sử dụng Asp.Net hoặc Asp.Net Mvc, tạo một trang, lưu trữ nó bằng IIS.

4

Tôi vừa sử dụng thư viện này trong đơn đăng ký của mình. http://www.codeproject.com/KB/database/CsvReader.aspx. Mọi thứ diễn ra suôn sẻ khi sử dụng thư viện này, vì vậy tôi giới thiệu nó. Nó hoàn toàn miễn phí theo Giấy phép MIT, vì vậy chỉ cần bao gồm thông báo với các tệp nguồn của bạn.

Tôi không hiển thị CSV trong trình duyệt, nhưng tác giả có một số mẫu cho Repeaters hoặc DataGrids. Tôi đã chạy một trong các dự án thử nghiệm của mình để kiểm tra một hoạt động sắp xếp mà tôi đã thêm và nó trông khá tốt.

1

Đây chỉ là để phân tích cú pháp CSV. Để hiển thị nó trong một trang web, nó chỉ đơn giản là vấn đề lấy danh sách và hiển thị nó theo bất cứ cách nào bạn muốn.

Lưu ý: Ví dụ mã này không xử lý tình huống trong đó chuỗi đầu vào line chứa dòng mới.

public List<string> SplitCSV(string line) 
{ 
    if (string.IsNullOrEmpty(line)) 
     throw new ArgumentException(); 

    List<string> result = new List<string>(); 

    int index = 0; 
    int start = 0; 
    bool inQuote = false; 
    StringBuilder val = new StringBuilder(); 

    // parse line 
    foreach (char c in line) 
    { 
     switch (c) 
     { 
      case '"': 
       inQuote = !inQuote; 
       break; 

      case ',': 
       if (!inQuote) 
       { 
        result.Add(line.Substring(start, index - start) 
         .Replace("\"","")); 

        start = index + 1; 
       } 

       break; 
      } 

      index++; 
     } 

     if (start < index) 
     { 
      result.Add(line.Substring(start, index - start).Replace("\"","")); 
     } 

     return result; 
    } 
} 
+2

Nó cũng không xử lý việc sử dụng các ký tự ngoặc kép trong một giá trị. CSV có nhiều trường hợp cạnh, tốt nhất là chỉ sử dụng thư viện. – Arafangion

1

Dường như có một vài dự án trên CodeProject hoặc CodePlex cho phân tích cú pháp CSV. Dưới đây là một CSV Parser trên CodePlex

http://commonlibrarynet.codeplex.com/

Thư viện này có các thành phần cho phân tích cú pháp CSV, INI tập tin phân tích cú pháp, Command-Line phân tích cú pháp là tốt. Nó hoạt động tốt cho tôi cho đến nay. Chỉ có điều là nó không có một CSV Writer.

+2

Chỉ là một FYI: Giấy phép trên trang web nói rằng đó là MIT, nhưng trong chính mã nguồn, tất cả các tệp liên quan đến Csv đều có giấy phép LGPL nổi bật ở trên cùng. –

4

Bạn có thể thử CsvHelper, là dự án tôi làm việc. Mục tiêu của nó là làm cho việc đọc và ghi các tệp CSV dễ dàng nhất có thể, trong khi rất nhanh.

Dưới đây là một số cách bạn có thể đọc từ tệp CSV.

// By type 
var records = csv.GetRecords<MyClass>(); 
var records = csv.GetRecords(typeof(MyClass)); 

// Dynamic 
var records = csv.GetRecords<dynamic>(); 

// Using anonymous type for the class definition 
var anonymousTypeDefinition = 
{ 
    Id = default(int), 
    Name = string.Empty, 
    MyClass = new MyClass() 
}; 
var records = csv.GetRecords(anonymousTypeDefinition); 
43

Lựa chọn, không sử dụng các thành phần của bên thứ ba, là sử dụng lớp Microsoft.VisualBasic.FileIO.TextFieldParser (http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx). Nó cung cấp tất cả các chức năng để phân tích cú pháp CSV. Nó là đủ để nhập khẩu lắp ráp Microsoft.VisualBasic.

var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(file); 
parser.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited; 
parser.SetDelimiters(new string[] { ";" }); 

while (!parser.EndOfData) 
{ 
    string[] row = parser.ReadFields(); 
    /* do something */ 
} 
+0

Để đọc tệp CSV và tự cung cấp phân tích cú pháp, điều này lý tưởng. Đơn giản nhưng đầy đủ tính năng, bao gồm các giá trị được trích dẫn trên nhiều dòng. – ErikHeemskerk

+0

Đây là giải pháp yêu thích của tôi về giải pháp hộp – Habeeb

16

Bạn có thể sử dụng Microsoft.VisualBasic.FileIO.TextFieldParser lớp trong C#:

using System; 
using System.Data; 
using Microsoft.VisualBasic.FileIO; 

static void Main() 
{ 
    string csv_file_path = @"C:\Users\Administrator\Desktop\test.csv"; 

    DataTable csvData = GetDataTableFromCSVFile(csv_file_path); 

    Console.WriteLine("Rows count:" + csvData.Rows.Count);  
    Console.ReadLine(); 
} 

private static DataTable GetDataTableFromCSVFile(string csv_file_path) 
{ 
    DataTable csvData = new DataTable(); 

    try 
    { 
     using(TextFieldParser csvReader = new TextFieldParser(csv_file_path)) 
     { 
      csvReader.SetDelimiters(new string[] { "," }); 
      csvReader.HasFieldsEnclosedInQuotes = true; 
      string[] colFields = csvReader.ReadFields(); 

      foreach (string column in colFields) 
      { 
       DataColumn datecolumn = new DataColumn(column); 
       datecolumn.AllowDBNull = true; 
       csvData.Columns.Add(datecolumn); 
      } 

      while (!csvReader.EndOfData) 
      { 
       string[] fieldData = csvReader.ReadFields(); 
       //Making empty value as null 
       for (int i = 0; i < fieldData.Length; i++) 
       { 
        if (fieldData[i] == "") 
        { 
         fieldData[i] = null; 
        } 
       } 

       csvData.Rows.Add(fieldData); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
    } 

    return csvData; 
} 
+0

Thư viện này là giải pháp yêu thích của tôi trong giải pháp hộp. – Habeeb

+0

Điều duy nhất tôi thay đổi từ ví dụ này là kiểm tra cùng tên cột và thêm một số mã để hiển thị ngoại lệ – andrewjboyd

2

Tôi khuyên bạn nên Angara.Table, khoảng lưu/tải: http://predictionmachines.github.io/Angara.Table/saveload.html.

Nó làm cho suy luận kiểu cột, có thể lưu tệp CSV và nhanh hơn nhiều so với TextFieldParser.Nó theo RFC4180 cho định dạng CSV và hỗ trợ chuỗi nhiều dòng, NaN và chuỗi thoát có chứa ký tự dấu tách.

Thư viện dưới giấy phép MIT. Mã nguồn là https://github.com/Microsoft/Angara.Table.

Mặc dù API của nó tập trung vào F #, nhưng nó có thể được sử dụng trong bất kỳ ngôn ngữ .NET nào nhưng không gọn gàng như trong F #.

Ví dụ:

using Angara.Data; 
using System.Collections.Immutable; 

... 

var table = Table.Load("data.csv"); 

// Print schema: 
foreach(Column c in table) 
{ 
    string colType; 
    if (c.Rows.IsRealColumn) colType = "double"; 
    else if (c.Rows.IsStringColumn) colType = "string"; 
    else if (c.Rows.IsDateColumn) colType = "date"; 
    else if (c.Rows.IsIntColumn) colType = "int"; 
    else colType = "bool"; 

    Console.WriteLine("{0} of type {1}", c.Name, colType); 
} 

// Get column data: 
ImmutableArray<double> a = table["a"].Rows.AsReal; 
ImmutableArray<string> b = table["b"].Rows.AsString; 

Table.Save(table, "data2.csv"); 
0

Tôi đã được duy trì một dự án mã nguồn mở được gọi là trong nhiều năm nay. Nó có sẵn cho .NET Core và .NET 4.5.1. Không giống như hầu hết các lựa chọn thay thế, nó cho phép bạn định nghĩa một lược đồ (tương tự như cách làm việc của mã EF đầu tiên) với mức độ chính xác cực cao, do đó bạn không phải chống lại các vấn đề chuyển đổi mọi lúc. Bạn có thể ánh xạ trực tiếp tới các lớp dữ liệu của bạn, và cũng có hỗ trợ cho việc giao tiếp với các lớp ADO.NET cũ hơn.

Hiệu suất-khôn ngoan, nó được điều chỉnh để trở thành một trong những trình phân tích cú pháp nhanh nhất cho .NET, với rất nhiều tùy chọn cho sự khác biệt về định dạng kỳ quặc. Ngoài ra còn có hỗ trợ cho các tập tin có độ dài cố định, nếu bạn cần.

+0

Đề nghị đọc: [Cách cung cấp thư viện mã nguồn mở cá nhân?] (// meta.stackexchange.com/q/229085) –

0

Bạn có thể thử Cinchoo ETL - một lib nguồn mở để đọc và ghi tệp CSV.

Couple cách bạn có thể đọc các tập tin CSV

Id, Name 
1, Tom 
2, Mark 

Đây là cách bạn có thể sử dụng thư viện này để đọc nó

using (var reader = new ChoCSVReader("emp.csv").WithFirstLineHeader()) 
{ 
    foreach (dynamic item in reader) 
    { 
     Console.WriteLine(item.Id); 
     Console.WriteLine(item.Name); 
    } 
} 

Nếu bạn có POCO đối tượng được xác định để phù hợp với tập tin CSV như bên dưới

public class Employee 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Bạn có thể phân tích cùng một tệp bằng cách sử dụng lớp POCO này dưới đây

using (var reader = new ChoCSVReader<Employee>("emp.csv").WithFirstLineHeader()) 
{ 
    foreach (var item in reader) 
    { 
     Console.WriteLine(item.Id); 
     Console.WriteLine(item.Name); 
    } 
} 

Vui lòng xem bài viết tại CodeProject về cách sử dụng.

Disclaimer: Tôi là tác giả của thư viện này

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