2013-07-17 36 views
6

Tôi có một danh sách mà tôi muốn ghi vào chuỗi CSV.Danh sách chung cho chuỗi CSV

Các ví dụ tôi đã tìm thấy tất cả dường như là cho các danh sách đơn lẻ, tôi có nhiều mục.

Mã tôi hiện có;

private static string CreateCSVTextFile<T>(List<T> data, string seperator = ",") where T : ExcelReport, new() 
{ 
    var objectType = typeof(T); 
    var properties = objectType.GetProperties(); 
    var currentRow = 0; 
    var returnString = ""; 
    foreach (var row in data) 
    { 
    var currentColumn = 0; 
    var lineString = ""; 
    foreach (var info in properties) 
    { 
     lineString = lineString + info.GetValue(row, null) + seperator; 
     currentColumn++; 
    } 
    if (seperator != "") 
    { 
     lineString = lineString.Substring(0, lineString.Count() - 2); 
    } 
    returnString = returnString + Environment.NewLine + lineString; 
    currentRow++; 
    } 
    return returnString; 
} 

Nhưng khi danh sách lớn thì phương pháp này mất nhiều thời gian để chạy.

Lớp học danh sách của tôi dựa trên vẻ ngoài;

internal class ClientMasterFile 
{ 
public String COL1{ get; set; } 
public String COL2{ get; set; } 
public String COL3{ get; set; } 
public String COL4{ get; set; } 
public String COL5{ get; set; } 
public String COL6{ get; set; } 
public String COL7{ get; set; } 
public String COL8{ get; set; } 
public String COL9{ get; set; } 
public String COL10{ get; set; } 
public String COL11{ get; set; } 
public String COL12{ get; set; } 
} 

Có cách nào nhanh hơn để thực hiện việc này bằng phiên bản nâng cao của chuỗi.Xin không?

Cảm ơn

+3

Bạn đang sử dụng dây nối. Sử dụng 'StringBuilder'. – Romoku

+2

Tạo một phương thức ToString() ghi đè trong ClientMasterFile của bạn và bạn sẽ không cần Reflection vì đó là những gì mất quá lâu ở đó. –

Trả lời

17

phương pháp của bạn có thể được đơn giản hóa bằng StringBuilderstring.Join.

Ghép chuỗi trực tiếp chậm và sử dụng nhiều bộ nhớ phù hợp cho các hoạt động nhỏ.

Xem: Does StringBuilder use more memory than String concatenation?

private static string CreateCSVTextFile<T>(List<T> data, string seperator = ",") 
{ 
    var properties = typeof(T).GetProperties(); 
    var result = new StringBuilder(); 

    foreach (var row in data) 
    { 
     var values = properties.Select(p => p.GetValue(row, null)); 
     var line = string.Join(seperator, values); 
     result.AppendLine(line); 
    } 

    return result.ToString(); 
} 

Một thực hiện đầy đủ hơn cho CSV:

private static string CreateCSVTextFile<T>(List<T> data) 
{ 
    var properties = typeof(T).GetProperties(); 
    var result = new StringBuilder(); 

    foreach (var row in data) 
    { 
     var values = properties.Select(p => p.GetValue(row, null)) 
           .Select(v => StringToCSVCell(Convert.ToString(v))); 
     var line = string.Join(",", values); 
     result.AppendLine(line); 
    } 

    return result.ToString(); 
} 

private static string StringToCSVCell(string str) 
{ 
    bool mustQuote = (str.Contains(",") || str.Contains("\"") || str.Contains("\r") || str.Contains("\n")); 
    if (mustQuote) 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.Append("\""); 
     foreach (char nextChar in str) 
     { 
      sb.Append(nextChar); 
      if (nextChar == '"') 
       sb.Append("\""); 
     } 
     sb.Append("\""); 
     return sb.ToString(); 
    } 

    return str; 
} 

Sử dụng: escaping tricky string to CSV format

+0

Chỉ cần thử điều này, chạy ngay lập tức. Cảm ơn bạn. –

+0

Bạn không cần các ràng buộc chung. Tôi rất vui vì bạn thấy điều này hữu ích! – Romoku

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