Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的CSV文件末尾有一百万个空字符_C#_Asp.net Mvc - Fatal编程技术网

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

C# 为什么我的CSV文件末尾有一百万个空字符,c#,asp.net-mvc,C#,Asp.net Mvc,我正在动态生成CSV数据导出。为此,我获取一组散列项,然后逐行转换它们,并将它们写入MemoryStream,然后将其作为FileResult发送到客户端。问题是文件末尾大约有一百万个空字符,我猜这些字符的数量等于哈希集中的项目数量。但它们在文件的末尾,而不是每行的末尾 无论如何,代码是这样的: 控制器方法: public ActionResult ExportList(ListExportModel model) { System.IO.MemoryStream ms = ls.Expor

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

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

控制器方法:

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;
    }
和文件(所有虚拟数据,在截图制作过程中没有实际人员受到伤害):

注意:无论我是否使用

writer.Flush()

stream.Position=0


或者不

您的.csv文件末尾可能有很多空行。这将导致在处理结束时多次执行默认的:case。

您调用的是
GetBuffer()
,而不是
ToArray()

见:

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

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


我要试一试。你能解释一下为什么这会导致空值吗?@JuannStrauss:我添加了文档的链接,它有一个小的解释。好吧,你每天都能学到新东西!谢谢,这很有效。我将为您的问题添加解释以供将来参考。GetBuffer文档备注部分:
注意,缓冲区包含可能未使用的已分配字节。例如,如果将字符串“test”写入MemoryStream对象,则从GetBuffer返回的缓冲区长度为256,而不是4,未使用252字节。要仅获取缓冲区中的数据,请使用ToArray方法;但是,ToArray会在内存中创建一个数据副本。
我本来希望避免复制一个60MB的文件流,但是如果我不能,我就不能。情况并非如此。switch()是每行执行的,因此如果是这种情况,我会在每行末尾看到一个null,而不是全部在文件末尾。是的,但是如果输入文件末尾有很多空行,则会在每一空行中显示一个null,但所有这些都聚集在文件末尾。我看你有答案了,太好了。