Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在解析csv时,循环跳过virst行_C#_Csv_Parsing - Fatal编程技术网

C#在解析csv时,循环跳过virst行

C#在解析csv时,循环跳过virst行,c#,csv,parsing,C#,Csv,Parsing,我需要解析一个简单的CSV文件,它具有可变的列长度。供参考 我试图编写一些条件来解析每一行,并根据每一行中第一列包含的值将其存储到一个谨慎的字符串中 我遇到的第一个问题是,我的循环似乎从第2行开始读取。这是因为TextFieldParser假定了一个头吗 第二个问题是我的if语句的计算似乎不正确。如果我改变了文件中行的顺序,那么顺序中的第一个If应该解析“Lighting”行(不管文件中哪些行包含“Lighting”) 请注意,我正在.NET3.5环境中工作 以下是到目前为止我得到的信息: na

我需要解析一个简单的CSV文件,它具有可变的列长度。供参考

我试图编写一些条件来解析每一行,并根据每一行中第一列包含的值将其存储到一个谨慎的字符串中

我遇到的第一个问题是,我的循环似乎从第2行开始读取。这是因为TextFieldParser假定了一个头吗

第二个问题是我的if语句的计算似乎不正确。如果我改变了文件中行的顺序,那么顺序中的第一个If应该解析“Lighting”行(不管文件中哪些行包含“Lighting”)

请注意,我正在.NET3.5环境中工作

以下是到目前为止我得到的信息:

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这是有意义的。基本上,一旦行数据是
字段的一部分,那么业务逻辑应该基于
字段驱动。