处理从CSV导入的引号

时间:2016-01-11 14:50:16

标签: c# mysql excel csv delimiter

我从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));

列(在记事本++中)看起来像这样;

"DIY Test, Test"

然而,当我在MySQL中打开表格时,它就像这样导入了;

DIY Test, Test"

我现在错过了一个引号。然后这会导致导入,并且列到处都是!我认为这与我如何处理逗号和引号有关,我怎么能避免这种情况呢?

FoxPro文件中的原始文本看起来像;

DIY Test, Test

没有引号!只是逗号。我的班级使用MySQLBulkLoader看起来像这样;

    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);
    }

使用FieldTerminatorFieldQuotationCharacter这样错了吗?

编辑:为Danny添加了整行;

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

2 个答案:

答案 0 :(得分:0)

另一个选项是名为TextFieldParser的Microsoft.VisualBasic.FileIO名称空间中内置于.NET的CSV导入程序。它的代码可以正确处理列内容的引号。

答案 1 :(得分:0)

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"" monitor, Samsung",或使用\(linux样式) - 取决于读者。