2010-02-14 14 views
2

我創建一個CSV文件,我使用StringBuilder的此刻我來到一個新的類「CommaDelimitedStringCollection」。這是高效的StringBuilder或CommaDelimitedStringCollection

任何人都可以告訴我哪些是用來寫入文件數據。你也有什麼想法使用TextWriter

感謝

+0

[手動逗號分隔與酷酷的CommaDelimitedStringCollection類!](http://izlooite.blogspot.com/2009/12/manual-comma-separation-versus-cool.html) – 2012-03-20 15:02:28

回答

2

如果編寫CSV是一項非常複雜的任務,我可能會依賴像CommaDelimitedStringCollection這樣的助手。然而,這並不複雜,所以沒有理由在這裏引入一個額外的輔助類以及相關的perf命中。

如果我出於某種原因需要在內存中構建一個字符串,例如實現一般的ToString()方法,我會使用StringBuilder而不是直接級聯。但是,在這種情況下,您正在寫入某種類型的流,因此您不需要額外的步驟。

TextWriter是一個抽象類,但您希望其中的類的層次結構,特別是StreamWriter。這個類有許多構造函數重載;如果要直接寫入流(例如,在ASP.NET中爲Response.OutputStream),則需要一個文件名,如果要寫入本地文件,而另一個需要Stream對象。

我居然做了一個快速谷歌搜索,並有不似乎是實際執行一個CSV下載有任何很好的例子,如果這是你想要做什麼,所以這裏是一個:

void ExportCsvAttachment(IEnumerable<Customer> customers) 
{ 
    Response.Clear(); 
    Response.ContentType = "text/plain"; 
    Response.AddHeader("Content-Disposition: attachment;filename=Customers.csv"); 
    using (StreamWriter writer = new StreamWriter(Response.OutputStream)) 
    { 
     WriteCsv(writer, customers); 
    } 
    Response.End(); 
} 

void WriteCsv(TextWriter writer, IEnumerable<Customer> customers) 
{ 
    foreach (Customer cust in customers) 
    { 
     writer.Write(cust.ID); 
     writer.Write(','); 
     WriteCsvString(writer, cust.Name); 
     writer.Write(','); 
     WriteCsvString(writer, cust.PhoneNumber); 
    } 
} 

void WriteCsvString(TextWriter writer, string s) 
{ 
    writer.Write('"'); 
    writer.Write(s.Replace("\"", "\"\"")); 
    writer.Write('"'); 
} 

這使用CSV最常用的轉義機制 - 字符串周圍的引號,另一個引號作爲轉義字符。

如果您只想導出到本地文件,請刪除ExportCsvAttachment中的所有Response行,並使用帶有路徑的StreamWriter構造函數。

0

你可以使用流,如TextWriter的,將數據推送到你應該選擇該選項的文件的任何時間。如果你不得不建立它,那麼我會使用stringbuilder。這就是它的用途,但是你將產品保留在記憶中,並且在追加時會導致性能處罰。

任何與集合有關的事情都應該拋出紅旗,除非它的使用是不可避免的。

只是我的2比索。

+0

或者除非你正在做的事情是探索性的研究目的。絕對不是一個好主意:)有時你只需要完成這項工作。 – 2016-01-08 11:50:55

1

肯定會用ASP.Net的TextWriter。這裏的技巧是確保您所考慮的textwriter與輸出/響應流直接相關。這樣你就不會在內存中建立你的csv響應的全部內容,而是將它限制在輸出緩衝區的大小。

0

我從來沒有使用過CommaDelimitedStringCollection,但給了它在文檔中的一瞥並嘗試一下,我猜測它的目的是在csv文件中表示一行,也許我錯了。但是ToString()給出了一個csv與集合中的值分離的文本行,在讀取csv文件時這可能非常有用,但在構建具有標題行的整個新文件時,我不會將其用於有用性。

因爲你很可能希望有比數據單行我會建議使用StringBuilder頭多,我的猜測是,CommaDelimitedStringCollection使用StringBuilder的產生是在toString()方法自己的字符串值

相關問題