Почему у меня есть миллион нулевых символов в конце моего файла CSV

Я генерирую CSV-экспорт данных "на лету". Я делаю это, получая хешсет элементов, а затем преобразуя их в строку для строки и записывая их в MemoryStream, который, в свою очередь, отправляется клиенту как FileResult. Проблема в том, что в конце файла около миллиона символов NULL, я бы предположил, что число этих символов равно количеству элементов в хэш-наборе. Но они находятся в конце файла, а не в конце каждой строки.

В любом случае, код такой:

Метод контроллера:

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

или не

2 ответа

Вы вызываете GetBuffer() вместо ToArray().

Смотрите: http://msdn.microsoft.com/en-us/library/system.io.memorystream.toarray

Этот метод пропускает неиспользуемые байты в MemoryStream из массива. Получить весь буфер, используйте метод GetBuffer.

Этот метод возвращает копию содержимого MemoryStream как байтовый массив. Если текущий экземпляр был сконструирован на предоставленном байте массив, копия раздела массива, к которому этот экземпляр имеет доступ возвращается. Подробнее см. Конструктор MemoryStream.


Похоже, в конце вашего CSV файла может быть много пустых строк. Это приведет к тому, что по умолчанию: case будет выполняться много раз в конце обработки.

licensed under cc by-sa 3.0 with attribution.