我从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);
}
使用FieldTerminator
和FieldQuotationCharacter
这样错了吗?
编辑:为Danny添加了整行;
21,630,459,462,0,Test ,1996-08-02,14:45:04 ,2,Test ,"DIY Test, Test "
答案 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样式) - 取决于读者。