【问题标题】:Wrong output when Write a list of class using CsvHelper in C#在 C# 中使用 CsvHelper 编写类列表时输出错误
【发布时间】:2019-12-19 03:18:54
【问题描述】:

我想将我的课程导出为 .csv 文件,我关注此评论:https://stackoverflow.com/a/38088636/10152334

但是当我导出(在 Buses_Data.Buses_List 中)时,我的数据输出错误,所有数据都在同一行:

public void ExportToCSV(Buses_Data classToExport, string filepath)
    {
        try
        {
            if (File.Exists(filepath))
            {
                Console.WriteLine("Le fichier existe");
                System.IO.File.Delete(filepath);
                Console.WriteLine("l'ancien fichier à été supprimé");
            }

            Console.WriteLine("Export :...");


            using (StreamWriter sw = new StreamWriter(filepath))
            using (CsvWriter cw = new CsvWriter(sw))
            {
                cw.WriteHeader<Bus>();

                foreach (Bus emp in classToExport.Buses_List)
                {
                    cw.WriteRecord<Bus>(emp);
                }
            }

            Console.WriteLine("Export CSV: OK");
        }
        catch (Exception i)
        {
            Console.WriteLine("Error ! " + i);
        }
    }

我不知道为什么代码不起作用

编辑: 错误的输出:

右输出(数据不对应)

编辑 2: 我试过这个评论:Enforce LF line endings with CsvHelper

using (StreamWriter sw = new StreamWriter(filepath))

            using (CsvWriter cw = new CsvWriter(sw))
            {
                cw.WriteHeader<Bus>();

                foreach (Bus emp in classToExport.Buses_List)
                {

                    cw.WriteRecord<Bus>(emp);
                    sw.NewLine = "\n";
                    cw.NextRecord();
                }
            }

我有更好的结果,但我的巴士 N°1 在第一线,而不是在第二线

解决方案:

using (StreamWriter sw = new StreamWriter(filepath))
            using (CsvWriter cw = new CsvWriter(sw))
            {
                cw.WriteHeader<Bus>();
                cw.NextRecord();
                foreach (Bus emp in classToExport.Buses_List)
                {

                    cw.WriteRecord<Bus>(emp);
                    //sw.NewLine = "\n";
                    cw.NextRecord();
                }
            }

【问题讨论】:

  • CSV 文件只是带有分隔符的文本文件。你检查过实际文件吗?它包含什么?此处发布的屏幕截图根本没有帮助
  • 可能是您用来导入 CSV 数据的任何程序都无法识别换行符,最终将所有内容都显示在同一行中。例如,当您双击 CSV 文件并希望它在 Excel 中打开时,Excel 会使用系统默认的换行符、小数点和列表分隔符导入数据。你必须去Data &gt; From Text 指定你想要的分隔符
  • 如果您想为 Excel 创建文件,为什么不使用 Epplus 之类的库创建 实际 Excel 文件?
  • @PanagiotisKanavos 我使用的是 Microsoft Office 企业版 2019,但它可以与其他文件一起使用
  • @Bensuperpc 在WriteHeader 之后添加NextRecord()CsvWriter 本身就是这样做的

标签: c# .net csv export-to-csv csvhelper


【解决方案1】:

基于 GitHub issue 的回答,由 Josh Close 撰写:

写完标题后,您需要调用NextRecord()。 这样您就可以在之前或之后手动编写更多字段。

我试过了,效果很好。

【讨论】:

  • 很好地指出这一点。他的输出似乎表明他在两个地方都需要这个。
【解决方案2】:

你试过CsvWriter.NextRecord吗?

foreach (Bus emp in classToExport.Buses_List)
{
    cw.WriteRecord<Bus>(emp);
    cw.NextRecord();
}

【讨论】:

  • 根据doc example这不需要
  • 是的,如果 OP 更改其模式以写入所有记录。我不确定他们是否想在每次记录写入(日志记录、通知等)之间触发一些其他代码,所以我不想假设重构会是答案。该方法没有贬值,所以我认为它显然是预期 API 使用的一部分:github.com/JoshClose/CsvHelper/blob/master/src/CsvHelper/…
  • 你是对的。我一直忘记......这些例子是多么的特殊,而且大多数时候人们必须检查测试,而不是文档。
  • 我试过(用其他解决方案),我有更好的结果(见我的第二次编辑)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 2020-04-20
相关资源
最近更新 更多