C#在解析csv时,循环跳过virst行
我需要解析一个简单的CSV文件,它具有可变的列长度。供参考 我试图编写一些条件来解析每一行,并根据每一行中第一列包含的值将其存储到一个谨慎的字符串中 我遇到的第一个问题是,我的循环似乎从第2行开始读取。这是因为TextFieldParser假定了一个头吗 第二个问题是我的if语句的计算似乎不正确。如果我改变了文件中行的顺序,那么顺序中的第一个If应该解析“Lighting”行(不管文件中哪些行包含“Lighting”) 请注意,我正在.NET3.5环境中工作 以下是到目前为止我得到的信息:C#在解析csv时,循环跳过virst行,c#,csv,parsing,C#,Csv,Parsing,我需要解析一个简单的CSV文件,它具有可变的列长度。供参考 我试图编写一些条件来解析每一行,并根据每一行中第一列包含的值将其存储到一个谨慎的字符串中 我遇到的第一个问题是,我的循环似乎从第2行开始读取。这是因为TextFieldParser假定了一个头吗 第二个问题是我的if语句的计算似乎不正确。如果我改变了文件中行的顺序,那么顺序中的第一个If应该解析“Lighting”行(不管文件中哪些行包含“Lighting”) 请注意,我正在.NET3.5环境中工作 以下是到目前为止我得到的信息: na
namespace CSV_Handler_Console
{
public class Program
{
public static void Main(string[] args)
{
//Console.WriteLine("Press Enter");
string filePath = "C:\\Users\\chris\\Desktop\\ConfigFile.csv";
string subLight = "Lighting";
string subPin = "PIN";
string subProc = "Processor";
string subFab = "Fabuloso";
string subQuirky = "Quirky";
//string[] fields = csvParser.ReadFields();
string category = string.Empty;
string index = string.Empty;
string load1 = string.Empty;
string load2 = string.Empty;
string load3 = string.Empty;
string load4 = string.Empty;
string value = string.Empty;
string light1 = string.Empty;
string light2 = string.Empty;
string light3 = string.Empty;
string pin = string.Empty;
string processor1 = string.Empty;
string processor2 = string.Empty;
string processor3 = string.Empty;
string processor4 = string.Empty;
string processor5 = string.Empty;
string processor6 = string.Empty;
string processor7 = string.Empty;
string processor8 = string.Empty;
string display1 = string.Empty;
string display2 = string.Empty;
string display3 = string.Empty;
string display4 = string.Empty;
string display5 = string.Empty;
string display6 = string.Empty;
string display7 = string.Empty;
string display8 = string.Empty;
var path = String.Format("{0}", filePath);
using (TextFieldParser csvParser = new TextFieldParser(path))
{
csvParser.SetDelimiters(new string[] { "," });
//csvParser.HasFieldsEnclosedInQuotes = false;
string row = csvParser.ReadLine();
while (!csvParser.EndOfData)
{
if (row.Contains(subLight))
{
string[] fields = csvParser.ReadFields();
category = fields[0];
index = fields[1];
load1 = fields[2];
load2 = fields[3];
load3 = fields[4];
load4 = fields[5];
if(index.Contains("1"))
{
light1 = row;
}
else if (index.Contains("2"))
{
light2 = row;
}
else if (index.Contains("3"))
{
light3 = row;
}
string rowData = string.Format("{0},{1},{2},{3},{4},{5}", category, index, load1, load2, load3, load4);
Console.WriteLine(rowData);
//Console.ReadLine();
}
else if (row.Contains(subPin))
{
string[] fields = csvParser.ReadFields();
category = fields[0];
index = fields[1];
value = fields[2];
string rowData = string.Format("{0},{1},{2}", category, index, value);
Console.WriteLine(rowData);
}
else if (row.Contains(subProc))
{
string[] fields = csvParser.ReadFields();
category = fields[0];
index = fields[1];
value = fields[2];
if (index.Contains("A"))
{
processor1 = row;
}
else if (index.Contains("B"))
{
processor2 = row;
}
else if (index.Contains("C"))
{
processor3 = row;
}
else if (index.Contains("D"))
{
processor4 = row;
}
else if (index.Contains("E"))
{
processor5 = row;
}
else if (index.Contains("F"))
{
processor6 = row;
}
else if (index.Contains("G"))
{
processor7 = row;
}
else if (index.Contains("H"))
{
processor8 = row;
}
string rowData = string.Format("{0},{1},{2}", category, index, value);
Console.WriteLine(rowData);
}
else if (row.Contains(subQuirky) || row.Contains(subFab))
{
string[] fields = csvParser.ReadFields();
category = fields[0];
index = fields[1];
value = fields[2];
if (index.Contains("A"))
{
display1 = row;
}
else if (index.Contains("B"))
{
display2 = row;
}
else if (index.Contains("C"))
{
display3 = row;
}
else if (index.Contains("D"))
{
display4 = row;
}
else if (index.Contains("E"))
{
display5 = row;
}
else if (index.Contains("F"))
{
display6 = row;
}
else if (index.Contains("G"))
{
display7 = row;
}
else if (index.Contains("H"))
{
display8 = row;
}
string rowData = string.Format("{0},{1},{2}", category, index, value);
Console.WriteLine(rowData);
}
else
{
Console.WriteLine("No Match Found");
}
}
Console.ReadLine();
}
}
}
任何指导都将不胜感激。这是您的实施。首先使用ReadLine获取第一行,这会将光标前进到下一行。然后,如果该行包含搜索属性,则执行ReadFields操作,这是文档的第2行 如果您的数据总是保证有类别,那么您可以使用ReadFields并与第一个元素进行比较。如果希望查看当前行的内容而不推进光标,则可以查看PeekChars TextFieldParser.ReadLine:以字符串形式返回当前行,然后 将光标前进到下一行 TextFieldParser.ReadFields:读取当前行上的所有字段, 将它们作为字符串数组返回,并将光标前进到 下一行包含数据 TextFieldParser.PeekChars:读取指定数量的字符,而不推进光标
这是你的实现。首先使用ReadLine获取第一行,这会将光标前进到下一行。然后,如果该行包含搜索属性,则执行ReadFields操作,这是文档的第2行 如果您的数据总是保证有类别,那么您可以使用ReadFields并与第一个元素进行比较。如果希望查看当前行的内容而不推进光标,则可以查看PeekChars TextFieldParser.ReadLine:以字符串形式返回当前行,然后 将光标前进到下一行 TextFieldParser.ReadFields:读取当前行上的所有字段, 将它们作为字符串数组返回,并将光标前进到 下一行包含数据 TextFieldParser.PeekChars:读取指定数量的字符,而不推进光标
恰恰相反。您显示“未找到匹配项”,因为标头与代码中的任何IF语句都不匹配。该初始读线将光标移动到第二行。作为澄清,此文件不包含标头。在看到你的评论之前,我也对我的帖子进行了编辑,不确定它是否会提供更多的信息。我担心可能是这样。在不前进到下一行的情况下初始化“行”字符串的更好方法是什么?换句话说,我需要字符串中的数据进行计算,但我不知道如何分配字符串,而不调用ReadLine()来获取它:/恰恰相反。您显示“未找到匹配项”,因为标头与代码中的任何IF语句都不匹配。该初始读线将光标移动到第二行。作为澄清,此文件不包含标头。在看到你的评论之前,我也对我的帖子进行了编辑,不确定它是否会提供更多的信息。我担心可能是这样。在不前进到下一行的情况下初始化“行”字符串的更好方法是什么?换句话说,我需要字符串中的数据进行计算,但我不知道如何分配字符串,而不调用ReadLine()来获取它:/这实际上是有意义的。我是否应该在while循环开始时访问我的ReadLine(),并在if语句中简单地查看一下呢?如果您可以保证第一列(类别)总是填充的,我就使用ReadFields。我将使用一些建议更新答案,我将其更改为:while(!csvParser.EndOfData){string[]fields=csvParser.ReadFields();string-toCheck=fields[0];if(fields[0]。Contains(subLight)){Etc.Etc,这很有效-谢谢!完美。还请注意,您可以通过简单地执行以下操作重新使用现有的基于行的赋值:string row=string.Join(“,”,fields);在设置字段数组之后。@bradleyfitz这是有意义的。基本上,一旦行数据是
字段的一部分,那么业务逻辑就应该基于字段来驱动。这实际上是有意义的。我应该转到我的ReadLine()吗在while循环开始时,只需在if语句中查看?如果您能保证始终填充第一列(类别),我将只使用ReadFields。我将使用一些建议更新答案,我将其更改为:while(!csvParser.EndOfData){string[]fields=csvParser.ReadFields();string-toCheck=fields[0];if(fields[0].Contains(subLight)){Etc.Etc,这很有效-谢谢!完美。还请注意,您可以通过简单的操作重新使用现有的基于行的赋值:string-row=string.Join(“,”,fields);在设置字段数组之后。@bradleyfitz这是有意义的。基本上,一旦行数据是字段的一部分,那么业务逻辑应该基于字段驱动。