我正在创建一个CSV文件,而我正在使用 StringBuilder ,此时我来到了一个新的类“ CommaDelimitedStringCollection ”。
任何人都可以告诉我哪个更适合用来写文件数据。你还想到了如何使用 TextWriter 。
由于
答案 0 :(得分:2)
如果编写CSV是一项非常复杂的任务,我可能会依赖CommaDelimitedStringCollection
之类的帮助程序。但是,它并不复杂,因此没有理由在此处引入额外的辅助类以及相关的perf命中。
如果由于某种原因需要在内存中构建字符串,例如实现一般的ToString()
方法,我会使用StringBuilder
而不是直接连接。但是,在这种情况下,您正在写入某种流,因此您也不需要这个额外的步骤。
TextWriter
是一个抽象类,但您需要其中的类层次结构,特别是StreamWriter
。这个类有很多构造函数重载;如果要写入本地文件,则获取文件名;如果要直接写入流,则另一个获取Stream
对象(例如,ASP.NET中的Response.OutputStream
)。
我实际上做了一个快速的谷歌搜索,似乎没有任何实际实施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转义机制 - 引用字符串,另一个引用作为转义字符。
如果您只想导出到本地文件,请删除Response
中的所有ExportCsvAttachment
行,并使用带有路径的StreamWriter
构造函数。
答案 1 :(得分:1)
绝对适用于ASP.Net的TextWriter。这里的技巧是确保您正在考虑的文本编写器直接绑定到输出/响应流。这样,您就不会在内存中构建csv响应的全部内容,而是将其限制为输出缓冲区的大小。
答案 2 :(得分:0)
只要您可以使用文本编写器等流将数据推送到文件,就应该选择该选项。
如果你必须构建它,那么我会使用stringbuilder。这就是它的用途,但你保留产品的记忆并在追加时会产生性能损失。
任何与集合有关的事情都应该引起一面红旗,除非它的使用是不可避免的。
只是我的2比索。
答案 3 :(得分:0)
我从来没有使用过CommaDelimitedStringCollection,但是在对文档进行了简短的介绍并尝试了一下后我会猜测它的目的是在csv文件中表示一行,也许我对此错了。但是ToString()给出了一个csv分隔的文本行,其中包含了集合中的值,这在读取csv文件时非常有用,但是在构建带有标题行的全新文件时,我并没有因其实用性而被出售。
由于您可能希望使用标题和多行数据,我建议使用StringBuilder,我的猜测是CommaDelimitedStringCollection使用stringbuilder在ToString()中生成自己的字符串值
答案 4 :(得分:0)
班级的全名是System.Configuration.CommaDelimitedStringCollection。这似乎不是通用的CSV类,或者它将在System.Collections或System.IO中。