C# 读取csv文件忽略双引号和标题中的逗号
如何忽略双引号内的逗号和csv头行第一行C# 读取csv文件忽略双引号和标题中的逗号,c#,C#,如何忽略双引号内的逗号和csv头行第一行 string csvData = File.ReadAllText(csvPath); foreach (string row in csvData.Split('\n')) { if (!string.IsNullOrEmpty(row)) { dt.Rows.
string csvData = File.ReadAllText(csvPath);
foreach (string row in csvData.Split('\n'))
{
if (!string.IsNullOrEmpty(row))
{
dt.Rows.Add();
int i = 0;
foreach (string cell in row.Split(','))
{
dt.Rows[dt.Rows.Count - 1][i] = cell;
i++;
}
}
}
我将给出一般伪代码中的算法,因为这个问题不是c语言特有的,但归根结底是要知道你是否在一个开放的双引号中 保留一面旗帜,上面写着你是否在双引号内 逐字符读取每一行 只要在点击双引号时切换此标志,它就会反转其值 当您读取逗号且标志为false时,您可以转储到当前单元格值为止读取的所有字符,并开始累积为新的当前单元格再次读取的字符 使用 而不是分裂 忽略第一行。使用for循环或foreach中的计数器跳过第一个循环 正则表达式是从我的头顶开始的,所以它可能需要一些调整,但它应该可以工作 但是像这样的事情可能会很复杂。。。使用csv库可能是一个考虑因素…来自Microsoft.VisualBasic.dll的文件可能有助于满足此要求
using (TextFieldParser MyReader = new TextFieldParser(csvPath))
{
MyReader.TextFieldType = FieldType.Delimited;
MyReader.SetDelimiters(",");
MyReader.HasFieldsEnclosedInQuotes = true;
string[] currentRow;
currentRow = MyReader.ReadFields();
while(!MyReader.EndOfData)
{
DataRow row = dt.NewRow();
currentRow = MyReader.ReadFields();
for(int i = 0; i < currentRow.Length; i++)
{
row[i] = currentRow[i];
}
dt.Rows.Add(row);
}
}
根据我有限的经验,这个类的速度不是很快,但这是您可以使用的,而无需使用需要随应用程序重新分发的外部软件包。找到CSV解析库?您可以使用具有所需功能的TextFieldParser。您也不想使用文件。ReadAllText。。。这里可以找到更好的方法:或者如果你喜欢John Skeet,那么这里是他的方法:正则表达式似乎不起作用,但是,,=?:[^\]*\[^\]*.[^\]*.[^\]*$起作用。尽管在规模上进行评估非常缓慢。
using (TextFieldParser MyReader = new TextFieldParser(csvPath))
{
MyReader.TextFieldType = FieldType.Delimited;
MyReader.SetDelimiters(",");
MyReader.HasFieldsEnclosedInQuotes = true;
string[] currentRow;
currentRow = MyReader.ReadFields();
while(!MyReader.EndOfData)
{
DataRow row = dt.NewRow();
currentRow = MyReader.ReadFields();
for(int i = 0; i < currentRow.Length; i++)
{
row[i] = currentRow[i];
}
dt.Rows.Add(row);
}
}