【问题标题】:Streamwriter adding in extra line breaks randomly when exporting from visual studio to csv c#从visual studio导出到csv c#时Streamwriter随机添加额外的换行符
【发布时间】:2023-04-04 23:59:01
【问题描述】:

我一直在尝试在数据记录后将数据表导出到 Visual Studio 中的 csv。

由于某种原因,我在导入 excel 时得到了奇怪的结果,而记事本很好。似乎正在添加换行符,但在数据中的随机点。

我已经为此奋斗了一段时间,因此感谢您的帮助!

Excel Version

Notepad Version

void SaveAllData()
    {
        {
            saveFileDialog1.InitialDirectory = "C"; // open save file window
            saveFileDialog1.Title = "Save as CSV File"; // promt save as csv
            saveFileDialog1.FileName = DateTime.Now.ToString("dd.MM.yy_HH.mm");
            saveFileDialog1.Filter = "CSV File | *.csv"; // csv format

            if (saveFileDialog1.ShowDialog() != DialogResult.Cancel) // if save dialog opens 
            {
                string value = "";
                DataGridViewRow dr = new DataGridViewRow();
                StreamWriter swOut = new StreamWriter(saveFileDialog1.FileName, true, Encoding.ASCII);

                //write header rows to csv
                for (int i = 0; i <= IncomingDataTable.Columns.Count - 1; i++)
                {
                    if (i > 0)
                    {
                        swOut.Write(",");
                    }
                    swOut.Write(IncomingDataTable.Columns[i].HeaderText);
                }

                swOut.WriteLine();

                //write DataGridView rows to csv
                for (int j = 0; j <= IncomingDataTable.Rows.Count - 1; j++)
                {
                    if (j > 0)
                    {
                        swOut.WriteLine();
                    }
                    dr = IncomingDataTable.Rows[j];

                    for (int i = 0; i <= IncomingDataTable.Columns.Count - 1; i++)
                    {
                        if (i > 0)
                        {
                            swOut.Write(",");

                       }

                        value = dr.Cells[i].Value.ToString();
                        swOut.Write(value);

                    }
                }
                swOut.Close();
            }

    MessageBox.Show("Your data has been successfully saved.", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information); // alert user file has saved



            serialPort1.Close(); // close serial port
            Setup_Page f1 = new Setup_Page(); // open setup page
            this.Hide();
            f1.ShowDialog();
            Close(); // close this page
        }
    }

【问题讨论】:

  • 有一些库可以为您执行此操作:nuget.org/packages/CsvHelper
  • @Magnus 我的问题不是导出为 CSV,而是在导出过程中我的数据中出现换行符。
  • 您的传入数据是否包含换行符?尝试在写字板而不是记事本中打开 CSV 文件,因为写字板会在换行时中断,但记事本不会。如果这是问题所在,请在写入之前修剪所有传入数据。
  • @Lithis 天才!最烦人的事情是我已经在修剪我的数据,但没有将修剪后的数据用于表格。非常感谢您的帮助!

标签: c# excel visual-studio csv streamwriter


【解决方案1】:

如果您的输入数据包含换行符并且您将其输出,则某些应用程序会将其视为换行符,但有些则不会。记事本没有,所以它看起来像记事本的单行。 Excel 识别换行并开始新行。在写字板而不是记事本中打开 CSV 文件;写字板将识别换行,而它们在记事本中是不可见的。

简单的解决方法是在写入输入数据之前调用String.Trim。然而,正如 Magnus 所说,图书馆是你的朋友。如果您使用了一个好的库,那么这可能一开始就不是问题,因为编写良好的库会处理数据中嵌入的换行符。

你可能会说你可以修剪换行符。好吧,如果换行符在您的数据中间怎么办? Trim 不会处理。不会有换行符吗?逗号呢?不会有任何逗号,因为数据只是数字?如果它是一个小数,并且生成它的计算机位于法国或许多其他使用逗号作为小数分隔符的国家,该怎么办?数据中的引号呢?图书馆可能已经处理了所有这些情况。 (对于使用输出的人来说,逗号小数点分隔符可能仍然是个问题,但至少 CSV 格式正确。)

但请注意,CSV 不是一个明确定义的标准。不同的应用程序和库使用不同的策略来处理上述情况,因此如果您的库没有使用与 Excel 相同的格式,它仍然可能无法正确加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2015-10-02
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    相关资源
    最近更新 更多