我創建一個CSV文件,我使用StringBuilder的在此刻我來到一個新的類「CommaDelimitedStringCollection」。這是高效的StringBuilder或CommaDelimitedStringCollection
任何人都可以告訴我哪些是用來寫入文件數據。你也有什麼想法使用TextWriter。
感謝
我創建一個CSV文件,我使用StringBuilder的在此刻我來到一個新的類「CommaDelimitedStringCollection」。這是高效的StringBuilder或CommaDelimitedStringCollection
任何人都可以告訴我哪些是用來寫入文件數據。你也有什麼想法使用TextWriter。
感謝
如果編寫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
構造函數。
你可以使用流,如TextWriter的,將數據推送到你應該選擇該選項的文件的任何時間。如果你不得不建立它,那麼我會使用stringbuilder。這就是它的用途,但是你將產品保留在記憶中,並且在追加時會導致性能處罰。
任何與集合有關的事情都應該拋出紅旗,除非它的使用是不可避免的。
只是我的2比索。
或者除非你正在做的事情是探索性的研究目的。絕對不是一個好主意:)有時你只需要完成這項工作。 – 2016-01-08 11:50:55
肯定會用ASP.Net的TextWriter。這裏的技巧是確保您所考慮的textwriter與輸出/響應流直接相關。這樣你就不會在內存中建立你的csv響應的全部內容,而是將它限制在輸出緩衝區的大小。
我從來沒有使用過CommaDelimitedStringCollection,但給了它在文檔中的一瞥並嘗試一下,我猜測它的目的是在csv文件中表示一行,也許我錯了。但是ToString()給出了一個csv與集合中的值分離的文本行,在讀取csv文件時這可能非常有用,但在構建具有標題行的整個新文件時,我不會將其用於有用性。
因爲你很可能希望有比數據單行我會建議使用StringBuilder頭多,我的猜測是,CommaDelimitedStringCollection使用StringBuilder的產生是在toString()方法自己的字符串值
的該班的全名是System.Configuration.CommaDelimitedStringCollection。這看起來不是一個通用的CSV類,也可能是System.Collections或System.IO。
[手動逗號分隔與酷酷的CommaDelimitedStringCollection類!](http://izlooite.blogspot.com/2009/12/manual-comma-separation-versus-cool.html) – 2012-03-20 15:02:28