2010-06-28 41 views
13

Tôi cần đọc từ tệp phân tách CSV/Tab và ghi vào tệp như vậy từ .net.Đọc/ghi các tệp phân tách CSV/tab trong C#

Khó khăn là tôi không biết cấu trúc của mỗi tệp và cần ghi tệp cvs/tab vào một dữ liệu có thể định cấu hình được, mà thư viện FileHelpers dường như không hỗ trợ.

Tôi đã viết nó cho Excel bằng OLEDB, nhưng thực sự không thể thấy cách viết tệp tab cho điều này, do đó sẽ quay lại thư viện.

Có ai có thể trợ giúp với đề xuất không?

Trả lời

7

Tôi đã sử dụng số CsvReader này, nó thực sự tuyệt vời và có thể định cấu hình tốt. Nó hoạt động tốt với tất cả các loại thoát cho dây và phân cách. Việc chạy trốn trong các triển khai nhanh chóng và dơ bẩn khác là kém, nhưng lib này thực sự tuyệt vời khi đọc. Với một vài codelines bổ sung, bạn cũng có thể thêm bộ nhớ cache nếu cần.

Viết không được hỗ trợ nhưng nó khá tầm thường để tự thực hiện. Hoặc truyền cảm hứng cho mình từ this code.

+0

Xin lỗi .. nó cảm thấy một chút xa với tôi, nhưng tôi đoán xem xét chính của tôi với việc viết các tập tin csv là delimiting các chuỗi (nó được một lúc kể từ khi tôi đã phải làm csv tập tin). –

+0

Tôi đã thêm liên kết để viết CSV, bạn có thể thay thế một số chuỗi không đổi bằng dấu phân cách ưa thích của mình và nó sẽ ổn. Đọc phức tạp hơn nhiều so với việc viết ... – jdehaan

+0

Nhưng việc ghi các tệp CSV có chứa các chuỗi tùy ý là không nhỏ. Hãy nhớ các chuỗi thoát! –

1

Dưới đây là một vài CSV triển khai đọc:

http://www.codeproject.com/KB/database/CsvReader.aspx

http://www.heikniemi.fi/jhlib/ (chỉ là một phần của thư viện; bao gồm một nhà văn CSV quá)

tôi nghi ngờ có một cách tiêu chuẩn để chuyển đổi CSV để DataTable hoặc cơ sở dữ liệu 'tự động', bạn sẽ phải viết mã để làm điều đó. Làm thế nào để làm điều đó là một câu hỏi riêng biệt.

+2

Tại sao không chỉ sử dụng ứng dụng đi kèm với khung công tác .NET? –

1

Bạn sẽ tạo dữ liệu trong mã và (giả sử hàng tiêu đề) có thể tạo cột dựa trên dòng đầu tiên của bạn trong tệp. Sau đó, nó sẽ chỉ đơn giản là vấn đề đọc tệp và tạo các hàng mới dựa trên dữ liệu trong đó.

Bạn có thể sử dụng một cái gì đó như thế này:

DataTable Tbl = new DataTable(); 
using(StreamReader sr = new StreamReader(path)) 
{ 
    int count = 0; 
    string headerRow = sr.Read(); 
    string[] headers = headerRow.split("\t") //Or "," 
    foreach(string h in headers) 
    { 
    DataColumn dc = new DataColumn(h); 
    Tbl.Columns.Add(dc); 
    count++; 
    } 
    while(sr.Peek()) 
    { 
    string data = sr.Read(); 
    string[] cells = data.Split("\t") 
    DataRow row = new DataRow(); 
    foreach(string c in cells) 
    { 
     row.Columns.Add(c); 
    } 
    Tbl.Rows.Add(row); 
    } 
} 

Đoạn mã trên chưa được biên soạn, vì vậy nó có thể có một số lỗi, nhưng nó sẽ giúp bạn đi đúng hướng.

+0

Mã phân tách của bạn sai, vì bạn có thể có trình giảm hạng trong chuỗi được trích dẫn. –

+0

@ Jonathan Allen: Vâng, thực sự bạn có thể. Nó không được thiết kế để trở thành giải pháp đầy đủ ... chỉ là một con trỏ đến một ca khúc đúng. – AllenG

13

.NET đi kèm với trình phân tích cú pháp tệp CSV/tab được gọi là lớp TextFieldParser.

http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx

Nó hỗ trợ RFC đầy đủ cho các tập tin CSV và báo cáo lỗi thực sự tốt.

+5

Bạn phải yêu thích các lớp tiện ích chung trong Microsoft.VisualBasic.dll. – MgSam

+0

Thật không may điều này dường như không hỗ trợ xác định bạn sở hữu ký tự gói văn bản, nó giả định đây là một dấu ngoặc kép và chỉ cho phép bạn bật/tắt. – ChrisProsser

+1

Bạn có thể cung cấp ví dụ nhanh không? Liên kết không đủ câu trả lời. Nếu nó phá vỡ phản ứng này là vô ích cho bất kỳ googler. –

0

Bạn có thể đọc và viết tệp csv .. Điều này có thể hữu ích cho bạn.

qua chia char để tham số "serparationChar" này

Ví dụ: -

private DataTable dataTable = null; 
    private bool IsHeader = true; 
    private string headerLine = string.Empty; 
    private List<string> AllLines = new List<string>(); 
    private StringBuilder sb = new StringBuilder(); 
    private char seprateChar = ','; 


    public DataTable ReadCSV(string path, bool IsReadHeader, char serparationChar) 
    { 
     seprateChar = serparationChar; 
     IsHeader = IsReadHeader; 
     using (StreamReader sr = new StreamReader(path,Encoding.Default)) 
     { 
      while (!sr.EndOfStream) 
      { 
       AllLines.Add(sr.ReadLine()); 
      } 
      createTemplate(AllLines); 
     } 

     return dataTable; 
    } 
    public void WriteCSV(string path,DataTable dtable,char serparationChar) 
    { 
     AllLines = new List<string>(); 
     seprateChar = serparationChar; 
     List<string> StableHeadrs = new List<string>(); 
     int colCount = 0; 
     using (StreamWriter sw = new StreamWriter(path)) 
     { 
      foreach (DataColumn col in dtable.Columns) 
      { 
       sb.Append(col.ColumnName); 
       if(dataTable.Columns.Count-1 > colCount) 
       sb.Append(seprateChar); 
       colCount++; 
      } 
      AllLines.Add(sb.ToString()); 

      for (int i = 0; i < dtable.Rows.Count; i++) 
      { 
       sb.Clear(); 
       for (int j = 0; j < dtable.Columns.Count; j++) 
       { 
        sb.Append(Convert.ToString(dtable.Rows[i][j])); 
        if (dataTable.Columns.Count - 1 > j) 
        sb.Append(seprateChar); 
       } 
       AllLines.Add(sb.ToString()); 
      } 

      foreach (string dataline in AllLines) 
      { 
       sw.WriteLine(dataline); 
      } 
     } 


    } 

    private DataTable createTemplate(List<string> lines) 
    { 

     List<string> headers = new List<string>(); 
     dataTable = new DataTable(); 
     if (lines.Count > 0) 
     { 
      string[] argHeaders = null; 
      for (int i = 0; i < lines.Count; i++) 
      { 
       if (i > 0) 
       { 
        DataRow newRow = dataTable.NewRow(); 
        // others add to rows 
        string[] argLines = lines[i].Split(seprateChar); 
        for (int b = 0; b < argLines.Length; b++) 
        { 
         newRow[b] = argLines[b]; 
        } 
        dataTable.Rows.Add(newRow); 

       } 
       else 
       { 
        // header add to columns 
        argHeaders = lines[0].Split(seprateChar); 
        foreach (string c in argHeaders) 
        { 
         DataColumn column = new DataColumn(c, typeof(string)); 
         dataTable.Columns.Add(column); 
        } 
       } 

      } 

     } 
     return dataTable; 
    } 
0

Tôi đã tìm thấy giải pháp tốt nhất

http://www.codeproject.com/Articles/415732/Reading-and-Writing-CSV-Files-in-Csharp

Chỉ cần tôi phải viết lại

void ReadTest() 
{ 
    // Read sample data from CSV file 
    using (CsvFileReader reader = new CsvFileReader("ReadTest.csv")) 
    { 
     CsvRow row = new CsvRow(); 
     while (reader.ReadRow(row)) 
     { 
      foreach (string s in row) 
      { 
       Console.Write(s); 
       Console.Write(" "); 
      } 
      Console.WriteLine(); 

      row = new CsvRow(); //this line added 
     } 
    } 
} 
Các vấn đề liên quan