我正在创建一个 CSV 文件,并且正在使用 StringBuilder,此时我来到了一个新类“CommaDelimitedStringCollection”。
谁能告诉我用哪个更好地写入文件数据。另外您对使用 TextWriter 有何看法。
谢谢
最佳答案
如果编写 CSV 是一项非常复杂的任务,我可能会依赖像 CommaDelimitedStringCollection
这样的帮助器。然而,它并不复杂,因此没有理由在这里引入额外的帮助器类以及相关的性能命中。
如果我出于某种原因需要在内存中构建一个字符串,例如实现一个通用的ToString()
方法,我会使用StringBuilder
而不是直接串联。但是,在本例中,您正在写入某种类型的流,因此您也不需要这个额外的步骤。
TextWriter
是一个抽象类,但您想要其中的类的层次结构,特别是 StreamWriter
。该类有许多构造函数重载;如果您想写入本地文件,一个需要文件名,另一个需要 Stream
对象,如果您想直接写入流(例如 ASP.NET 中的 Response.OutputStream
)。
实际上,我在 Google 上进行了快速搜索,似乎没有任何实际实现 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
采用路径的构造函数。
关于c# - StringBuilder 和 CommaDelimitedStringCollection 哪个更高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2261397/