使用c#读取csv文件,不要读取双引号中的逗号
我正在用c#读取一个csv文件,这里有一个小代码片段使用c#读取csv文件,不要读取双引号中的逗号,c#,csv,C#,Csv,我正在用c#读取一个csv文件,这里有一个小代码片段 using (StreamReader readFile = new StreamReader("C:\\temp\\" + whichTable)) { while ((line = readFile.ReadLine()) != null) { row = line.Split(','); switch (row.Length) { case 5:
using (StreamReader readFile = new StreamReader("C:\\temp\\" + whichTable))
{
while ((line = readFile.ReadLine()) != null)
{
row = line.Split(',');
switch (row.Length)
{
case 5:
if (counter == 0)
{
break;
}
else
{
v00.Add(Convert.ToInt32(Regex.Replace(row[0], @"[^\w\.@-]", "")));
}
if (row[1] == "")
{
v01.Add((1));
}
else
{
v01.Add(Convert.ToInt32(Regex.Replace(row[1], @"[^\w\.@-]", "")));
}
if(row[2]=="")
{
v02.Add(2);
}
else
{
v02.Add(Convert.ToInt32(Regex.Replace(row[2], @"[^\w\.@-]", "")));
}
v3.Add(row[4]);
v4.Add(row[3]);
counter++;
break;
}
counter++;
}
break;
}
从我的代码中可以看出,我测试了字符串行的长度,以确保其长度正好为5。我的问题是,如果csv中有一个带有逗号的字段,那么它将计算到5以上。我的csv格式良好,因此当发生这种情况时,我确实有一个双引号字段。我如何告诉c#只计算双引号之外的逗号?这真的是我的问题。不要自己解析CSV——这种格式比大多数人意识到的更难正确解析。您可以使用许多现有的好的CSV解析器
命名空间中有一个库(常规的.NET库)和许多第三方库,这是一个受欢迎的自由选择。有多种可能的解决方法,最简单的方法是逐行逐字计算逗号。如果遇到引号,可以切换布尔值,例如
bool-inQuotes
,当inQuotes
为真时,您只需忽略逗号。您可以使用下面的代码,它对我有效:
private void ImportCSV(string filePath = @"E:\nucc_taxonomy_140.csv", string tableName = "TempTaxonomyCodes")
{
string tempPath = System.IO.Path.GetDirectoryName(filePath);
string strConn = @"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + tempPath + @"\;Extensions=asc,csv,tab,txt";
OdbcConnection conn = new OdbcConnection(strConn);
OdbcDataAdapter da = new OdbcDataAdapter("Select * from " + System.IO.Path.GetFileName(filePath), conn);
DataTable dt = new DataTable();
da.Fill(dt);
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(ConfigurationSettings.AppSettings["dbConnectionString"]))
{
bulkCopy.DestinationTableName = tableName;
bulkCopy.BatchSize = 50;
bulkCopy.WriteToServer(dt);
}
}
除非你想重新发明轮子,看看这个快速的CSV阅读器:不是一个固执己见的人或任何东西,但你应该尝试清理你的代码(即使只是在你把它发布到StackOverflow的时候)。izuriel现在代码出了什么问题?我愿意接受建议。@Miguel您没有将制表符长度转换为空格(并保持制表符在复制/粘贴代码时的状态),并且基本上缩小了if/else行。我不是说你的代码不好,需要修复,我只是说在这里发布时应该清理格式,我不是建议你应该把代码写得漂亮,除非你愿意,但是为了得到帮助,你可能想让它更干净,格式更好。谢谢你指出这一点。对不起,我真的认为我在这个职位上做得很好。下次我会做得更好。谢谢你的编辑。@EricJ嗯,是的。。。我宁愿解决根本问题,也不愿解决眼前的问题;)有趣的是,我似乎无法将该类添加到我的项目中。如果我尝试此操作,会出现一个错误,显示“错误23命名空间“Microsoft.VisualBasic”中不存在类型或命名空间名称“FileIO”(是否缺少程序集引用?)有什么想法吗?@Miguel-你是如何添加它的?你添加了对
Microsoft.VisualBasic.dll
程序集的引用了吗?@Oded没有,但当我读了你的最后一个注释后,它给了我提示。现在我添加了引用错误。你不会碰巧有一个小例子,用引用的字符串读取csv,是吗@Miguel-该页面上的VB.NET示例应该足以让您开始学习。