C# 将数据表导出到CSV时出现逗号问题

C# 将数据表导出到CSV时出现逗号问题,c#,.net,wpf,csv,export-to-csv,C#,.net,Wpf,Csv,Export To Csv,我采用了一些将数据表转换为CSV文件的代码。除了在实际数据中使用逗号外,它似乎工作得很好。在这种情况下,有没有办法显示逗号?这就是我所做的: StringBuilder sb = new StringBuilder(); IEnumerable<string> columnNames = dtResults.Columns .Cast<DataColumn>()

我采用了一些将数据表转换为CSV文件的代码。除了在实际数据中使用逗号外,它似乎工作得很好。在这种情况下,有没有办法显示逗号?这就是我所做的:

StringBuilder sb = new StringBuilder();

IEnumerable<string> columnNames = dtResults.Columns
                                           .Cast<DataColumn>()
                                           .Select(column => column.ColumnName);
sb.AppendLine(string.Join(",", columnNames));

foreach (DataRow row in dtResults.Rows)
{
    IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString());
    sb.AppendLine(string.Join(",", fields));
}

File.WriteAllText(saveFileDialog.FileName, sb.ToString());
StringBuilder sb=新建StringBuilder();
IEnumerable columnNames=dtResults.Columns
.Cast()
.Select(column=>column.ColumnName);
sb.AppendLine(string.Join(“,”,columnNames));
foreach(dtResults.Rows中的数据行)
{
IEnumerable fields=row.ItemArray.Select(field=>field.ToString());
sb.AppendLine(string.Join(“,”字段));
}
File.writealText(saveFileDialog.FileName,sb.ToString());

如果字段包含逗号,则应将其置于双引号(或单引号)中

您可以使用创建您的CSV文件,它应该负责正确转义

如果你不想使用这个库,关键的一点是:如果你有一个逗号,你必须把你的字段放在引号内,例如

ID, NAME
1, "Doe, John"
2, 'Doe, Jane'
如果字段中包含引号,则应使用附加引号将其转义:

3, "Anakin ""Darth Vader"", Skywalker"
4, 'O''Connor, Sinead'
一种可能的解决办法:

static string CsvEscape(this string value) {
    if (value.Contains(",")) {
        return "\"" + value.Replace("\"", "\"\"") + "\"";
    }
    return value;
}
然后在代码中:

IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString().CsvEscape());
IEnumerable fields=row.ItemArray.Select(field=>field.ToString().CsvEscape());

注:根据csv规范,没有真正的csv规范,但描述了一种常用的格式

我发布了下面修改过的代码,这将对您有所帮助

StringBuilder sb = new StringBuilder();

            string[] val =  { "ramesh","suresh, Ganesh" };
            IEnumerable<string> columnNames = val;

            IList<string> objFinal = new List<string>();
            foreach (string v in columnNames)
            {
                string temp = v;
                if (temp.Contains(","))
                    temp = "\"" + v + "\"";

                objFinal.Add(temp);
            }
            sb.AppendLine(string.Join(",", objFinal.AsEnumerable<string>()));

            }            
StringBuilder sb=新建StringBuilder();
字符串[]val={“ramesh”,“suresh,Ganesh”};
IEnumerable columnNames=val;
IList objFinal=新列表();
foreach(列名称中的字符串v)
{
字符串温度=v;
如果(温度包含(“,”))
temp=“\”+v+“\”;
对象最终添加(温度);
}
sb.AppendLine(string.Join(“,”,objFinal.AsEnumerable());
}            
CSV支持双代码之间的数据中的逗号

借助下面的一行代码,您可以在一个快照中附加双代码和逗号

IEnumerable<string> columnNames = dtResults.Columns
                                           .Cast<DataColumn>()
                                           .Select(column => column.ColumnName);

var res = columnNames.Aggregate((current, next) => "\"" + current + "\"" + ", " + "\"" + next + "\"");


File.WriteAllText(saveFileDialog.FileName, res.ToString());
IEnumerable columnNames=dtResults.Columns
.Cast()
.Select(column=>column.ColumnName);
var res=columnNames.Aggregate((当前,下一个)=>“\”“+current+”\”“+”、“+”\”“+next+”);
File.WriteAllText(saveFileDialog.FileName,res.ToString());

另一个可能重复的可能重复:
字段。ToString()
可能导致
NullReferenceException
。使用
string.Join(“,”,row.ItemArray)
或要保存
OP
更改为其大部分代码,请在字段选择中使用
@“\”“+field@\”
:)@卢克汉内利——请你详细说明一下好吗?:)@DotNET如果您有一种情况,您可以在某些数据中使用分隔符,您应该使用双引号将数据括起来
@LukeHennerley,但如果我在数据中也有
,该怎么办/@DotNET:我把我的答案扩大了一点。