为什么我的CSV文件末尾有一百万个空字符

时间:2014-12-03 10:16:42

标签: c# asp.net-mvc

我正在动态生成CSV数据导出。我这样做是通过获取项的哈希集,然后逐行转换它们并将它们写入MemoryStream,然后将其作为FileResult发送到客户端。问题是文件末尾有大约一百万个NULL字符,我猜这些字符的数量等于hashset中的项目数。但是它们位于文件的末尾,而不是每行的末尾。

无论如何,代码是这样的:

Controller方法:

public ActionResult ExportList(ListExportModel model)
{
  System.IO.MemoryStream ms = ls.ExportListToCsv(model,Server.MapPath("~/uploads"));
  return File(ms.GetBuffer(),"text/csv",model.MailingList.ListName + ".csv");
}

ExportListToCsv方法

public MemoryStream ExportListToCsv(ListExportModel model, string folderpath)
{
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);

    writer.WriteLine(string.Join(",", model.Columns));
    var data = GetListItemsFromCsv(model.ListId, folderpath);

    XmlDocument doc = new XmlDocument();
    // Parallel.ForEach(data, (li) =>
    foreach (var li in data)
    {
        string line = "";
        foreach (var field in model.Columns)
        {
            doc.LoadXml(li.CustomFields);
            switch (field)
            {
                //our standard fields
                    case "email":
                        line += li.Email + ",";
                        break;
                    case "tel":
                        line += li.Tel + ",";
                        break;

                    default:
                        line += (doc.SelectNodes("//" + field))[0].Value + ",";
                        break;
                }
            }

            writer.WriteLine(line.TrimEnd(','));
        }
        writer.Flush();
        stream.Position = 0;
        return stream;
    }

文件(所有虚拟数据,在制作截图时没有实际人员受到伤害): enter image description here

注意:无论是否使用

,我都会得到相同的结果
  

writer.Flush()

  

stream.Position = 0

是不是

2 个答案:

答案 0 :(得分:13)

您正在呼叫GetBuffer()而不是ToArray()

请参阅:http://msdn.microsoft.com/en-us/library/system.io.memorystream.toarray

  

此方法在数组的MemoryStream中省略未使用的字节。要得到   整个缓冲区,使用GetBuffer方法。

     

此方法返回MemoryStream内容的副本作为   字节数组。如果当前实例是在提供的字节上构造的   array,此实例所具有的数组部分的副本   访问被返回。有关详细信息,请参阅MemoryStream构造函数。

答案 1 :(得分:1)

看起来.csv文件末尾可能有很多空行。这将导致默认情况:在处理结束时多次执行。