【问题标题】:Export to CSV missing first record, using C# function使用 C# 函数导出到缺少第一条记录的 CSV
【发布时间】:2019-06-20 10:59:20
【问题描述】:

尝试导出为 CSV,一切正常,但是,所有导出都缺少第一行。将同一记录导出到 Excel 或 KML 时不会丢失此行。

尝试重写函数并添加一行,但没有任何效果

public FileResult ExportToCSV()
    {
       List<Tuple<String, String>> nameValues = new    
       List<Tuple<string, string>>();
       if (ReportSession.FilterKeys != null)
    {
       nameValues = (List<Tuple<String, String>>)  
       ReportSession.FilterKeys;
    }


       ReportRequestFilter dbr = (ReportRequestFilter)     
       ReportSession.DatabaseRequestFilter;


    List<Report_Packet_History> dplist = GetAllReportData 
    (dbr.Group_Id, dbr.AllowChildgroups, dbr.Device_Id, dbr.user_id,  
    MapLimitConstants.MAX_EXPORT_BULK_ROWS, dbr.Lookback, dbr.periodEnd, 1, 
    dbr.ShowActiveOnly);
    List<Report_Packet_History> dplistreturn = GetFilters(nameValues,  
    dplist);


    //SetReportViewBags(dplist);

    DateTime endDate = dplist.Max(dt => dt.gps_datetime);
    DateTime startDate = dplist.Min(dt => dt.gps_datetime);
    String[] Device = dplist.Select(dt => dt.imei).Distinct().ToArray();
    String[] Group = dplist.Select(dt => dt.user_group_name).Distinct   
    ().ToArray();

    Utility.LocalisedDateTime ldt = ToolBox.ConvertToUserTimezone 
    (DateTime.UtcNow, Session.CurrentUserSettings.time_zone, false,  
    Session.CurrentUserSettings.Locale);


    String fileName = "IRISReport_" + string.Format("{0}_to_{1}",   
    startDate.ToShortDateString(), endDate.ToShortDateString());
    fileName += string.Format(Device.Count() > 1 ? "_Assets_" : "_Asset_"  
     +  
    Device[0]);
    fileName += string.Format(Group.Count() > 0 ? "_Groups_" : "_Group_"    
    +  Group[0]);


    //List<Report_Packet_History> dplistres = GetFilters(nameValues,  
    dplist).Take(MapLimitConstants.MAX_EXPORT_CSV_ROWS).Skip  
    (0).ToList<Report_Packet_History>();

    //Response.Charset = "";

    return GenerateCSV(dplistreturn, fileName + ".csv");

    }

这是 GenerateCSV 方法,在哪里将标头设置为 false?我有第一行 = true。

private FileResult GenerateCSV(List<Report_Packet_History> report, String   
        FileName)
                {
                 Type rphType = typeof  
                 (Connector.Models.Report.Report_Packet_History);
                  PropertyInfo[] myField = 
                      rphType.GetProperties().ToArray();

                  Boolean firstRow = true;
                  StringBuilder csvOut = new StringBuilder();

                  MemoryTributary stream = new MemoryTributary();
                  foreach (Report_Packet_History rph in report)
                  {
                      for (int i = 0; i < myField.Length; i++)
                       {
                            if (firstRow)
                            {
                                csvOut.Append(myField[i].Name + ",");
                            }
                            else
                            {
                                if (myField[i].GetValue(rph) == null)
                                {
                                    csvOut. Append("" + ",");
                                }
                                else
                                {
                                    csvOut.Append(myField[i].GetValue  
                                    (rph).ToString() + ",");
                                 }
                              }
                         }
                         csvOut.Append("\r\n");
                         byte[] byteArray = Encoding.UTF8.GetBytes    
                                         (csvOut.ToString());
                         csvOut.Clear();

            stream.Write(byteArray, 0, byteArray.Length);
            firstRow = false;
        }

        stream.Seek(0, SeekOrigin.Begin);
        return File 
                  (stream,System.Net.Mime.MediaTypeNames.Application.Octet, 
                   FileName);
    }

【问题讨论】:

  • Generate CSV() 的代码在哪里??错误很可能在其中。
  • 请见上文
  • 有大量的 CSV 库,包括 ADO.NET。你为什么要在这里重新发明轮子?
  • 如果在GenerateCSV 中的foreach 循环开始处调试report[0] 的值是多少?这是你的第一个完整的行,还是第二个?也就是说,我在这里同意其他几个人的观点,即您应该使用固有的库,而不是从头开始重新发明 CSV 处理。

标签: c# function csv export-to-csv


【解决方案1】:

第一行应该是标题行,我猜在您的 GenerateCSV 方法中的某处您已将标题设置为 false。

【讨论】:

  • 请见上文
【解决方案2】:

你忽略了日期的第一行,而不是写你的标题。

当您使用i 开始循环时,它为零。您的第一行标志也是如此。 第一次迭代看到第一行标志并写入标题,然后重置标志。没关系。 但是,代码然后循环到下一次迭代,即第二行数据。

你需要先写出标题,然后开始循环遍历你的数据。

要全面改进,请查看File.WriteAllLines() ;)

【讨论】:

  • 如何将标头与循环其余数据分开?
  • 只需拉出您的第一条记录,迭代字段以获取标题,然后写入标题。然后开始你的数据迭代(你现有的循环),但没有第一行逻辑。
  • 或者换句话说,将逻辑的第一行部分拉出,使其位于循环之前。
  • 我已经尝试了你上面提到的方法,它可以工作,但并不完全符合我们的要求。有没有办法在某个地方添加一个额外的行来说明标题?
  • 我不明白。有什么不完全如你所愿?您可以轻松地添加任何额外的行 - 只需写一个回车即可。
猜你喜欢
  • 1970-01-01
  • 2020-09-07
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多