我的代码没有处理包含两个句子的某些字段。它将第一句写入.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();
}
}
如果你问我,CSV是一种令人讨厌的格式。逗号的传统终止列(逗号是十进制字符的区域性除外,它们有时使用分号),换行符终止行。若要确保将逗号或换行符数据视为数据,请将它们包装在双引号对中。
但是,这会向列表中添加另一个特殊字符:如果数据包含双引号值怎么办?您需要将它们转换为双双引号:
1,10,"This is my
multiline csv value, it ""may"" cause your parser to fail",8
维基百科提到一些程序不遵循规则:
带有嵌入式换行符的字段必须加引号(但是,许多 CSV 实现根本不支持此功能)。
您可能希望在记事本或其他东西中查看数据,以验证问题是否出在您的代码上,而不是使用它的程序。
可能您的句子包含破坏您的 csv 的回车符和换行符。
您可以在读取输入字段时删除该换行符。
我还建议使用字符串生成器并在循环结束时编写所有内容
// 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());