如何通过逗号读取CSV文件,除非它是字段的一部分

我有以下C#代码读取CSV文件,目标是将其保存到SQL表:

StreamReader sr = new StreamReader(tbCSVFileLocation.Text.ToString()); string line = sr.ReadLine(); string[] value = line.Split(','); DataTable dt = new DataTable(); DataRow row; foreach (string dc in value) { dt.Columns.Add(new DataColumn(dc)); } while (!sr.EndOfStream) { value = sr.ReadLine().Split(','); if (value.Length == dt.Columns.Count) { row = dt.NewRow(); row.ItemArray = value; dt.Rows.Add(row); } } 

我遇到的问题是我不知道数据来自我的表格。

以下是CSV文件的示例:

Name,Address,License Number,License Type,Year of Birth,Effective Date,Action,Misconduct Description,Date Updated "563 Grand Medical, PC","563 Grand Street Brooklyn, NY 11211",196275,,,09/29/2010,Revocation of certificate of incorporation.,"The corporation admitted guilt to the charge of ordering excessive tests, treatment, or use of treatment facilities not warranted by the condition of a patient.",09/29/2010 "Aaron, Joseph","2803 North 700 East Provo, Utah 84604",072800,MD,1927,01/13/1999,License Surrender,"This action modifies the penalty previously imposed by Order# 93-40 on March 31, 1993, where the Hearing Committee sustained the charge that the physician was disciplined by the Utah State Medical Board, and ordered that if he intends to engage in practice in NY State, a two-year period of probation shall be imposed.", "Aarons, Mark Gold","POBox 845 Southern Pines, North Carolina 28388",161530,MD,1958,12/13/2005,"License limited until the physician's North Carolina medical license is fully restored without any conditions.The physician must also comply with the terms imposed on July 26, 2005 by the North Carolina State Medical Board. The physician has completed the monitoring terms.",The physician did not contest the charge of having been disciplined by the North Carolina State Medical Board for his addiction to drugs.,12/06/2005

当我查看我的SQL表时,显示的是:

 Name Address License Number License Type Year of Birth Effective Date Action Misconduct Description Date Updated Orlando FL 32836" 173309 MD 1938 2/29/2012 License surrender The physician did not contest the charge of having had his DEA registration for Florida revoked by the US Drug Enforcement Administration for improperly prescribing controlled substances. 2/22/2012 Miami Florida 33156" 119545 MD 1945 10/10/2002 Censure and reprimand The physician did not contest the charge of having been disciplined by the Florida State Board of Medicine for giving a patient excessive doses of radiation. 10/10/2002 Brooklyn New York 11229" 192310 11/6/2003 Annulment of certificate of incorporation pursuant to Section 230-a of the New York State Public Health Law and Section 1503(d) of the New York State Business Corporation Law The corporation admitted guilt to the charge of willfully failing to comply with Section 1503 of the Business Corporation Law in violation of New York State Education Law Section 6530(12). 10/31/2003 

如您所见,第一行的第一列没有ORLANDO。 不知道发生了什么。

请帮我解决一下。

一些应该帮助您入门的代码..也可以使用Debugger来逐步执行代码

声明一个受保护的静态DataTable csvData并最初将其赋值为null

 protected static DataTable csvData = null; // declared up top in your class csvData = GetDataTabletFromCSVFile(fileName); //Converts the CSV File into a DataTable private static DataTable GetDataTabletFromCSVFile(string csv_file_path) { csvData = new DataTable(defaultTableName); try { using (TextFieldParser csvReader = new TextFieldParser(csv_file_path)) { csvReader.SetDelimiters(new string[] { tableDelim }); csvReader.HasFieldsEnclosedInQuotes = true; string[] colFields = csvReader.ReadFields(); foreach (string column in colFields) { DataColumn datecolumn = new DataColumn(column); datecolumn.AllowDBNull = true; csvData.Columns.Add(datecolumn); } while (!csvReader.EndOfData) { string[] fieldData = csvReader.ReadFields(); //Making empty value as null for (int i = 0; i < fieldData.Length; i++) { if (fieldData[i] == string.Empty) { fieldData[i] = string.Empty; //fieldData[i] = null } //Skip rows that have any csv header information or blank rows in them if (fieldData[0].Contains("Disclaimer") || string.IsNullOrEmpty(fieldData[0])) { continue; } } csvData.Rows.Add(fieldData); } } } catch (Exception ex) { } return csvData; } 

fieldData [0] .Contains(“Disclaimer”)这是我的.csv文件中的列,因此非常直接地阅读和理解逻辑,并根据需要进行更改以适合您的.csv文件

如果你想尝试更轻松的事情然后解析你在使用Quick Watch窗口时会得到的“\”字符试试这个

 var lines = File.ReadLines("FilePath of Some .csv File").Select(a => a.Split(',')).ToArray(); 

在CodeProject上使用Sebastien Loren的快速CSV阅读器 ,而不是自己动手。

出于原因,请参阅逗号分隔值(CSV)文件格式: 以此流行的伪标准格式创建或解析数据 。 将CSV称为“标准格式”是对“标准”一词的嘲弄。

你的问题更糟,因为看起来你有带嵌入式行尾标记的引用字段。 现在你必须解决你是否有截断记录或跨越多行的记录的问题。

如果您可以控制数据源,请考虑切换为使用JSON,XML或其他一些准基本格式进行数据交换。