使用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: 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; } 

你可以从我的代码中看出我测试字符串行的长度,以确保它的五个长度完全正确。 我的问题是,如果在csv中有一个带逗号的字段,那么计算到大于5.我的csv形成良好,所以当发生这种情况时,我确实有一个双引号的字段。 我怎么能告诉c#只计算双引号之外的逗号? 那真的是我的问题。

不要自己解析CSV – 这种格式比大多数人意识到的要难以解析。 您可以使用许多现有的优秀CSV解析器。

TextFieldParser库存在于Microsoft.VisualBasic.FileIO命名空间(常规.NET库)中,而许多第三方库 – FileHelpers是一种流行的自由选择。

有多种可能的解决方法,最简单的方法是逐字逐行,并自己计算逗号。 如果你遇到一个引号,你可以切换一个布尔值,比方说。 bool inQuotes ,当inQuotes为true时,你只需忽略逗号。

您可以使用以下代码,它为我工作:

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