C# 将数据导出到数据库表时,从csv单元格中转义逗号(,)

C# 将数据导出到数据库表时,从csv单元格中转义逗号(,),c#,.net,csv,datatable,delimiter,C#,.net,Csv,Datatable,Delimiter,我有一个csv文件,其中有一个字段中有逗号。e、 g在“办公室位置”列下,我有一个值xyz,building。当我通过调试器检查该值时,它只显示“\”xyz”。我尝试使用Replace(“,”)和Replace(“\”,”)对逗号和反斜杠进行转义,但失败了。另外,我在结果中得到了额外的\,标记为红色圆圈 我在调试显示csv行结构时附加了该图像。问题出在红色圆圈区域 我还尝试了以下功能: public static string RemoveColumnDelimitersInsideValue

我有一个csv文件,其中有一个字段中有逗号。e、 g在“办公室位置”列下,我有一个值xyz,building。当我通过调试器检查该值时,它只显示“\”xyz”。我尝试使用
Replace(“,”)
Replace(“\”,”)
对逗号和反斜杠进行转义,但失败了。另外,我在结果中得到了额外的
\
,标记为红色圆圈

我在调试显示csv行结构时附加了该图像。问题出在红色圆圈区域

我还尝试了以下功能:

public static string RemoveColumnDelimitersInsideValues(string input)
    {

        const char valueDelimiter = '"';
        const char columnDelimiter = ',';

        StringBuilder output = new StringBuilder();

        bool isInsideValue = false;
        for (var i = 0; i < input.Length; i++)
        {
            var currentChar = input[i];

            if (currentChar == valueDelimiter)
            {
                isInsideValue = !isInsideValue;
                output.Append(currentChar);
                continue;
            }

            if (currentChar != columnDelimiter || !isInsideValue)
            {
                output.Append(currentChar);
            }

        }
        return output.ToString();
    }
publicstaticstringremoveColumnDelimiterInsideValues(字符串输入)
{
常量char valueDelimiter='”;
常量字符列分隔符=',';
StringBuilder输出=新的StringBuilder();
bool-isInsideValue=false;
对于(变量i=0;i

请帮助解决这些问题。谢谢您看到的\字符不在实际字符串中,它只是在调试器视图中添加的转义字符

单击放大镜以获取字符串的实际值


希望对您有所帮助。

String.Replace
不会修改现有字符串,它会返回一个新字符串。因此,您在
IsNullOrEmpty
检查之外有相同的
字符串

另外,您正在告诉我们,您正在尝试转义逗号和引号,但您正在代码中删除它

如果要删除逗号和引号,代码可能如下所示

if(string.IsNullOrEmpty(行))
{
行=行。替换(“,”,“”)。替换(“\”,“”);
}
如果要转义引号和逗号,代码可能如下所示

if(行!=null&&row.Contains(“,”)
{
行=“\”+行。替换(“\”,“\”)+“\”;
}

尝试使用TextFieldParser,在csv中,如果列值带有逗号,则列值将用qoutes转义,因此将HasFieldsEnclosedInQuotes添加到true将自动将其读取为单列

using Microsoft.VisualBasic.FileIO;


using (TextFieldParser reader = new TextFieldParser(csvpath))
       {
         reader.Delimiters = new string[] { "," };
         reader.HasFieldsEnclosedInQuotes = true;
         string[] col =  reader.ReadFields();
       }

代码中有3个问题值得指出

1.解析CSV可能很棘手 是否正确地对多行字符串进行编码处理?是否对其中一列中的
进行编码处理(即转义的

我建议使用csv阅读库(又名NuGet包)

没有反斜杠 这是一个文件

1,"The string in the first row has a comma, and an f, in it"
2,The string in the 2nd row does not have a comma in it 
下面是VisualStudio显示的内容(我在这里使用VS代码)

这是Console.WriteLine打印的内容

1,"The string in the first row has a comma, and an f, in it"
2,The string in the 2nd row does not have a comma in it 
3.替换逗号
即使你处理引号,替换逗号不就可以去掉字段分隔符吗?

事实上,在我看来,这个反斜杠只是存在于调试器视图中。你应该尝试将这个字符串输出到一个文件中,看看反斜杠是否真的存在。简单的方法是使用一个现成的CSV解析器,它也需要c是值中的
,在值中转义为
。如果数据有逗号,则应以逗号分隔值(csv)的不同格式保存。尝试使用制表符分隔值(tsv)。