【问题标题】:CSVHelper not formatting CSVCSVHelper 未格式化 CSV
【发布时间】:2016-05-24 00:08:46
【问题描述】:

我正在使用 CSVHelper 编写我通过使用 MySqlDataReader 获得的 List。我的问题是正确格式化我的 CSV 文件,我创建了一个映射器类,该类应该通过列名指示数据的放置位置:

    public ReaderMap()
    {
        Map(m => m.accountpersonfirstname).Name("E-mail Address");
        Map(m => m.accountpersonlastname).Name("First Name");
        Map(m => m.emailaddress).Name("Last Name");
    }

这直接来自http://joshclose.github.io/CsvHelper/#mapping-name

我将假设我的问题在于我的流编写器如何写入我现有的 csv,因为它每次都会创建一个新的 CSV 文件(并且我失去了我的名字)但是我也尝试过使用映射按索引也应该适用于新的 CSV 文件,但它仍然将数据彼此相邻放置 我希望看到我的列相隔几列,以便数据可读 - 我还需要标题名称.

这是我的两个类 - 映射器和原始数据类。

class Reader
{
    public string emailaddress { get; set; }
    public string accountpersonfirstname { get; set; }
    public string accountpersonlastname { get; set; }
}

class ReaderMap : CsvClassMap<Reader>
{
    public ReaderMap()
    {
        Map(m => m.accountpersonfirstname).Name("E-mail Address");
        Map(m => m.accountpersonlastname).Name("First Name");
        Map(m => m.emailaddress).Name("Last Name");
    }
}

我还将粘贴我的部分代码,因为就像我上面提到的那样,也许我没有正确使用流编写器(即使我认为我是这样)。

            MySqlCommand cmd = new MySqlCommand(sqlCmd, cn);
            cmd.CommandType = CommandType.Text;
            MySqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                Reader dataExport = new Reader();

                dataExport.accountpersonfirstname = rdr.GetString(0);
                dataExport.accountpersonlastname = rdr.GetString(1);
                dataExport.emailaddress = rdr.GetString(2);


                dataList.Add(dataExport);

            }

            var textWriter = new StreamWriter(filePath);

            var csv = new CsvWriter(textWriter);
            csv.Configuration.RegisterClassMap<ReaderMap>();
            foreach (var item in dataList)
            {
                csv.WriteRecord(item);
            }

也许问题出在我上面的流写入器的启动中,或者这一切都可以追溯到使用数据读取器 - 我不完全确定。我希望有人可以为我阐明这一点。

编辑:

似乎使用以下允许它正确附加。但是,我最初的问题仍然存在,即当我将 csv 文件上的标题名字和姓氏进一步移动到 F 和 G 列时,它仍然将它们放在 B 和 C 处,就好像它完全忽略了我设置的类和配置.

var textWriter = new StreamWriter(filePath, true);

【问题讨论】:

  • 我建议你试试 FileHelpers 库。导出到 Csv 只需几行代码即可完成。

标签: c# csv console-application export-to-csv mysqldatareader


【解决方案1】:

当使用自定义CsvClassMap 时,输出以按列属性的方式写入,没有间隙,除非忽略某个属性,在这种情况下,不会输出该属性,但不会在忽略它的地方创建间隙.

为了创建您想要的间隙,您需要创建一个自定义方法,以您想要的格式写出文件。

//Write out the header
var csv = new CsvWriter(textWriter);
csv.WriteField("A Column Data");
csv.WriteField("B (Empty)");
csv.WriteField("C (Empty)");
csv.WriteField("D (Empty)");
csv.WriteField("E (Empty)");
csv.WriteField("F Column Data");
csv.WriteField("G Column Data");
csv.NextRecord(); //Newline

foreach (var item in dataList)
{
    csv.WriteRecord(item.PropertyA);
    csv.WriteRecord(string.Empty);
    csv.WriteRecord(string.Empty);
    csv.WriteRecord(string.Empty);
    csv.WriteRecord(string.Empty);
    csv.WriteRecord(item.PropertyB);
    csv.WriteRecord(item.PropertyC);
    csv.NextRecord();
}

说了这么多,你为什么要插入空白?插入间隙不会使 csv 更具可读性,如果您在 excel 或其他电子表格应用程序中打开它,请双击右侧标题边框,它会自动扩大列宽。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2015-06-07
    • 2023-02-07
    • 2013-02-10
    • 2019-06-02
    • 1970-01-01
    相关资源
    最近更新 更多