【问题标题】:Remove last (empty) entry from StringBuilder object, when exporting to CSV导出到 CSV 时,从 StringBuilder 对象中删除最后一个(空)条目
【发布时间】:2019-06-06 11:33:09
【问题描述】:

我想删除 StringBuilder 对象的最后(空)行

编辑:空行来自“AllowUserToAddRows”我怎么能跳过它?

  • c# 表单应用程序
  • form2 上的 dataGridView1
  • 我想导出为 CSV(用分号分隔)[顺便说一句。这只是一列]
  • 有可能会再次将之前创建的 CSV 解析为 dataGridView

我从这里使用了一个改变的解决方案: Exporting datagridview to csv file

我的代码

void SaveDataGridViewToCSV(string filename)
{
    var sb = new StringBuilder();

    var headers = dataGridView1.Columns.Cast<DataGridViewColumn>();
    sb.AppendLine(string.Join(";", headers.Select(column => "" + column.HeaderText + ";").ToArray()));

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        var cells = row.Cells.Cast<DataGridViewCell>();
        sb.AppendLine(string.Join(";", cells.Select(cell => "" + cell.Value + ";").ToArray()));
    }

    try
    {
        File.WriteAllText(filename, sb.ToString());
    }
    catch (Exception exceptionObject)
    {
        MessageBox.Show(exceptionObject.ToString());
    }
}

sb.ToString 看起来像这样 {Coumn;90;90;626;626;;}

“真正的”StringBuilder 对象作为 String 是: {Coumn;\r\n90;\r\n90;\r\n626;\r\n626;\r\n;}

我想删除空的最后一行。

我尝试将 stringbuilder 解析为字符串,然后删除最后一个分号 但没有成功(我对行尾有疑问。)

string s = sb.ToString();
while (s.EndsWith(";\r\n;") == true)
{
    s.Substring(0, s.Length - 5);
}

我试图删除数组的最后一个元素,但 StingBuilder 不是数组

我被困住了。

【问题讨论】:

  • 如果您只有 1 列,为什么还要为单元格使用 string.Join
  • @dymanoid 看起来像是 this answer 的复制和粘贴
  • 请注意Substring 不会修改字符串 - 试试s = s.Substring(0, s.Length - 5);
  • @dymanoid 是的,这很重要;如问题中所述,将来@A Friend 可能会更多列,是的,它源自该答案
  • 一开始不添加空行不是更容易吗?

标签: c# datagridview export-to-csv stringbuilder


【解决方案1】:

我发现空集总是导出到 csv。 这是因为用户可以向 dataGridView 输入数据,并且总是有一个空的活动行。

如果我禁用 dataGridView1.AllowUserToAddRows,则用户输入的空行不在 stringbuilder 数据集中。

   void SaveDataGridViewToCSV(string filename)
    {
        var sb = new StringBuilder();

        //SOLUTION disable AllowUserInput to avoid empty set saved to CSV
        dataGridView1.AllowUserToAddRows = false;

        var headers = dataGridView1.Columns.Cast<DataGridViewColumn>();
        sb.AppendLine(string.Join(";", headers.Select(column => "" + column.HeaderText + ";").ToArray()));

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            var cells = row.Cells.Cast<DataGridViewCell>();
            sb.AppendLine(string.Join(";", cells.Select(cell => "" + cell.Value + ";").ToArray()));
        }

        try
        {
            File.WriteAllText(filename, sb.ToString());
        }
        catch (Exception exceptionObject)
        {
            MessageBox.Show(exceptionObject.ToString());
        }
    }

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 2018-06-24
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多