C# 处理从CSV导入的引号

C# 处理从CSV导入的引号,c#,mysql,excel,csv,delimiter,C#,Mysql,Excel,Csv,Delimiter,我正在从CSV文件中导入大约30000行,但是当用户输入引号时,我在导入方面遇到了问题。当用户输入逗号(我使用逗号作为分隔符)时,我已经遇到了一个问题,但现在我遇到了一个更大的问题,一个我似乎找不到的问题 这就是我目前正在使用的 IEnumerable<string> fields = row.ItemArray.Select((field, index) => (dataTable.Columns[index].DataType == _datetype) ? ((DateT

我正在从CSV文件中导入大约30000行,但是当用户输入引号时,我在导入方面遇到了问题。当用户输入逗号(我使用逗号作为分隔符)时,我已经遇到了一个问题,但现在我遇到了一个更大的问题,一个我似乎找不到的问题

这就是我目前正在使用的

IEnumerable<string> fields = row.ItemArray.Select((field, index) => (dataTable.Columns[index].DataType == _datetype) ? ((DateTime)field).ToString("yyyy-MM-dd") :
(field.ToString().Contains(",") ? "\"" + field.ToString() + "\"" : field.ToString()));
sb.AppendLine(string.Join(",", fields));
然而,当我在MySQL中打开表时,它已经像这样导入了

"DIY Test, Test"
DIY Test, Test"
    public void WriteToMySQL(string mySqlTable)
    {
        MySqlConnection mysqlCon = new MySqlConnection(mysqlConstr);
        mysqlCon.Open();
        string tempCsvFileSpec = @"C:\Users\DanD\Desktop\test.csv";
        var msbl = new MySqlBulkLoader(mysqlCon);
        msbl.TableName = "sdcdatabase." + mySqlTable;
        msbl.NumberOfLinesToSkip = 1;
        msbl.FileName = tempCsvFileSpec;
        msbl.FieldTerminator = ",";
        msbl.FieldQuotationCharacter = '"';
        msbl.Load();
        File.Delete(tempCsvFileSpec);
    }
也就是说,它现在缺少一个引号。这会把导入搞得一团糟,结果列到处都是!我想这与我如何处理逗号和引号有关,我怎样才能避免这种情况呢

FoxPro文件中的原始文本看起来很简单

DIY测试,测试

没有引号!只是逗号。我使用
MySQLBulkLoader
的类如下所示

"DIY Test, Test"
DIY Test, Test"
    public void WriteToMySQL(string mySqlTable)
    {
        MySqlConnection mysqlCon = new MySqlConnection(mysqlConstr);
        mysqlCon.Open();
        string tempCsvFileSpec = @"C:\Users\DanD\Desktop\test.csv";
        var msbl = new MySqlBulkLoader(mysqlCon);
        msbl.TableName = "sdcdatabase." + mySqlTable;
        msbl.NumberOfLinesToSkip = 1;
        msbl.FileName = tempCsvFileSpec;
        msbl.FieldTerminator = ",";
        msbl.FieldQuotationCharacter = '"';
        msbl.Load();
        File.Delete(tempCsvFileSpec);
    }
像这样使用
FieldTerminator
FieldQuotationCharacter
是否错误

编辑:为Danny添加整行

21,630,459,462,0,Test                         ,1996-08-02,14:45:04  ,2,Test   ,"DIY Test, Test                                                                       "

另一个选项是CSV导入器,它内置在Microsoft.VisualBasic.FileIO命名空间中的.NET中,名为
TextFieldParser
。它的代码可以正确处理列内容周围的引号。

另一个选项是CSV导入器,它内置在Microsoft.VisualBasic.FileIO命名空间的.NET中,名为
TextFieldParser
。它有正确处理列内容周围引号的代码

21,630,459,462,0,Test                         ,1996-08-02,14:45:04  ,2,Test   ,"DIY Test, Test                                                                       "
您真正需要做的第一件事是修剪这些字段(如果您想保留空格,可以将它们括在引号中)。一些读者对分隔符周围的空间有问题

field.ToString().Contains(",") ? "\"" + field.ToString() + "\"" : field.ToString()
这不会在所有情况下都起作用。考虑这一点:

"27" monitor, Samsung"
当您的字段被引用时(对于
内部),字段内部的引号也需要转义。通常通过添加第二个引号:
“27”显示器,三星“
,或使用
\
(linux风格)-具体取决于阅读器

您真正需要做的第一件事是修剪这些字段(如果您想保留空格,可以将它们括在引号中)。一些读者对分隔符周围的空间有问题

field.ToString().Contains(",") ? "\"" + field.ToString() + "\"" : field.ToString()
这不会在所有情况下都起作用。考虑这一点:

"27" monitor, Samsung"

当您的字段被引用时(对于
内部),字段内部的引号也需要转义。通常通过添加第二个引号:
“27”显示器,三星“
,或使用
\
(linux风格)-取决于读者。

我正在考虑导出到CSV,而不是通过从C数据表导出,导入到MySQL来导入。对不起,你的问题是“从CSV导入”,我的错误!我正在从CSV导入到MySQL,从C#中的数据表导出到CSVI我正在考虑导出到CSV,而不是从C#数据表导入到MySQL。对不起,你的问题说“从CSV导入”是我的错!我正在从CSV导入到MySQL,从C#中的数据表导出到CSV列(在notepad++中)如下所示。整行是什么样子?@Danny_ds更新了我的问题Danny该列(在记事本++)中)如下所示。“整排看起来像什么?”丹尼更新了我的问题丹尼谢谢你回答丹尼。这很有趣,因为文本实际上是
DIY Test,Test
。这个句子里根本没有引号。由于
,它被引号包围。所以现在它看起来像CSV文件中的“DIY测试,测试”。当我将它导入MySQL时,它看起来像是
DIY Test,Test“
,完全搞乱了导入过程。谢谢你回答Danny。这很有趣,因为文本实际上是
DIY Test,Test
。句子中根本没有引号。由于
,它只是被引号包围。所以现在它看起来像
”DIY测试,在CSV文件中测试“
。当我将其导入MySQL时,它看起来像是
DIY测试,测试“
,完全搞乱了导入过程。