C# 处理从CSV导入的引号
我正在从CSV文件中导入大约30000行,但是当用户输入引号时,我在导入方面遇到了问题。当用户输入逗号(我使用逗号作为分隔符)时,我已经遇到了一个问题,但现在我遇到了一个更大的问题,一个我似乎找不到的问题 这就是我目前正在使用的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
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测试,测试“
,完全搞乱了导入过程。