1

我的代码不处理包含两个句子的某些字段。它将第一句写入 .csv 文件中的正确单元格。但是,SQL字段的第二句被写到第一列两行下......

private void SQLToCSV(string query, string Filename)
        {

            SqlConnection conn = new SqlConnection("redacted");
            conn.Open();
            SqlCommand cmd = new SqlCommand(query, conn);
            SqlDataReader dr = cmd.ExecuteReader();

            using (System.IO.StreamWriter fs = new System.IO.StreamWriter(Filename))
            {
                // Loop through the fields and add headers
                for (int i = 0; i < dr.FieldCount; i++)
                {
                    string name = dr.GetName(i);
                    if (name.Contains(","))
                        name = "\"" + name + "\"";

                    fs.Write(name + ",");
                }
                fs.WriteLine();

                // Loop through the rows and output the data
                while (dr.Read())
                {
                    for (int i = 0; i < dr.FieldCount; i++)
                    {
                        string value = dr[i].ToString();
                        if (value.Contains(","))
                            value = "\"" + value + "\"";

                        fs.Write(value + ",");
                    }
                    fs.WriteLine();
                }
            }
4

2 回答 2

1

如果你问我,CSV 是一种讨厌的格式。逗号传统上终止列(除了在逗号是十进制字符的文化中,它们有时使用分号),换行符终止行。为确保逗号或换行数据视为数据,请将它们包装在双引号对中。

但是,这会在列表中添加另一个特殊字符:如果您的数据包含双引号值怎么办?您需要将它们转换为双双引号:

1,10,"This is my
multiline csv value, it ""may"" cause your parser to fail",8

维基百科提到一些程序不遵守规则:

必须引用带有嵌入换行符的字段(但是,许多 CSV 实现根本不支持这一点)。

您可能想在记事本或其他东西中查看您的数据,以验证问题出在您的代码上,而不是使用它的程序。

于 2013-09-27T13:55:02.980 回答
0

可能您的句子包含破坏 csv 的回车和换行符。
您可以在读取输入字段时删除该 NewLine 字符。
另外我建议使用字符串生成器并在循环结束时编写所有内容

// Loop through the rows and output the data
StringBuilder sb = new StringBuilder();
while (dr.Read())
{
    for (int i = 0; i < dr.FieldCount; i++)
    {
        string value = dr[i].ToString();
        if (value.Contains(","))
            value = "\"" + value + "\"";

        sb.Append(value.Replace(Environment.NewLine, " ") + ",");
    }
    sb.Length--; // Remove the last comma
    sb.AppendLine();
}
fs.Write(sb.ToString());
于 2013-09-27T13:46:55.940 回答