C# 我试图解析一个不太一致的文件,并获取用户id';s、 名

C# 我试图解析一个不太一致的文件,并获取用户id';s、 名,c#,list,parsing,dictionary,C#,List,Parsing,Dictionary,我试图解析一个不太一致的文件,并获取用户id、名字和姓氏 一些用户id没有名称,显示为“未找到”。有些代码每行的项目数不同,因此会出现多个if/else if/block 我有一个用户ID字典作为键,还有一个struct对象,其中包含名字和姓氏作为值。这是我的大部分代码,我想向每个字典键(用户id)添加一个对象(名字和姓氏),但它当前正在向每个键(用户id)添加整个文件(名字和姓氏) 我在while循环中有dictionary.add,因此我认为它可以正确地将它们添加到dictionary中。我

我试图解析一个不太一致的文件,并获取用户id、名字和姓氏

一些用户id没有名称,显示为“未找到”。有些代码每行的项目数不同,因此会出现多个if/else if/block

我有一个用户ID字典作为键,还有一个struct对象,其中包含名字和姓氏作为值。这是我的大部分代码,我想向每个字典键(用户id)添加一个对象(名字和姓氏),但它当前正在向每个键(用户id)添加整个文件(名字和姓氏)

我在while循环中有dictionary.add,因此我认为它可以正确地将它们添加到dictionary中。我做错了什么

如果我打印的键和列表值不正确,请告诉我

编辑:由于“SACH”,修复了多重打印问题。我现在的另一个问题是解析。该文件本身有敏感信息,因此我将尽力提供类似于示例的内容

l User_ID SECTION(header)                                                                                                                               
  USER_ID                 text     USER_ID     L_Name F_Name some_digits                                                                                  
                          another line or two of unimportant info



l USER_ID SECTION(header)                                                                                                                               
  USER_ID                 text  letter  USER_ID   L_Name M_Name F_Name                                                                                        
                          more lines of unimportant info                       
我的问题是,这不是文件中所有条目的标准。如果我不确定预期的文本是什么,我如何才能始终获得名称

我在获取ID时没有问题,但由于条目不一致,我获取的一些名称不正确。有没有一种方法可以在不知道其确切位置或字符串的情况下获取名称

    public static void read_file() {

        //variable declaration
        string user_id = "*"; 
        string file_path = @"c:\users\blah\blah";
        string line_of_text;

        List<full_name> Name = new List<full_name>();

        //define dictionary for user id, last name, first name
        Dictionary<string, List<full_name>> dict = new Dictionary<string, List<full_name>>();

        var filestream = new System.IO.FileStream(file_path,
                                 System.IO.FileMode.Open,
                                 System.IO.FileAccess.Read,
                                 System.IO.FileShare.ReadWrite);
        var file = new System.IO.StreamReader(filestream, System.Text.Encoding.UTF8, true, 128);


        //loop through reading text file
        while ((line_of_text = file.ReadLine()) != null)
        {

            string[] temp = line_of_text.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);


            //check if first line (begins with 'l')
            //if first line, add first and last name to list Name
            int pos = Array.IndexOf(temp, "l");
            if (pos > -1)
            {
                user_id = temp[1];
                line_of_text = file.ReadLine();
                string[] line2 = line_of_text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                int pos2 = Array.IndexOf(line2, "NOT");
                if (pos2 > -1) {
                    Name.Add(new full_name()
                    {
                        f_name = "NOT",
                        l_name = "FOUND"
                    });
                }

                else if (line2.Length == 4)
                {
                    Console.WriteLine("F: {0}, L: {1}", line2[3], line2[2]);
                    Name.Add(new full_name()
                    {
                        f_name = line2[3],
                        l_name = line2[2]
                    });
                }
                else if (line2.Length == 6)
                {
                    Console.WriteLine("F: {0}, L: {1}", line2[5], line2[4]);
                    Name.Add(new full_name()
                    {
                        f_name = line2[5],
                        l_name = line2[4]
                    });
                }
                else {
                    Console.WriteLine("F: {0}, L: {1}", line2[4], line2[3]);
                    Name.Add(new full_name()
                    {
                        f_name = line2[4],
                        l_name = line2[3]
                    });
                }
            }




            if (!dict.ContainsKey(user_id))
            {
                dict.Add(user_id, Name);
            }
        }
        int k = 1;
        int m = 1;
        foreach (KeyValuePair<string, List<full_name>> kvp in dict){
            foreach( full_name entry in Name){
                Console.WriteLine("{0}  ID: {1}  Last Name: {2}  First Name: {3}", k, kvp.Key, entry.l_name, entry.f_name);
                k++;
            }
        }
    }
List Name=新列表()在函数级别声明。在循环中声明它。它不断地附加到功能级列表,并不断地将其添加到每个用户id。

您的
列表名称
是在您读取文件的循环之外定义和实例化的

然后在循环内部,每次读取一行时,您都会将一条记录添加到
Name
,在循环结束之前,您会将
Name
添加到
dict
,这样随着循环的进行,您的
Name
列表会不断增加

您需要做的是每次在循环中创建一个
Name
实例(而不是列表),然后将其添加到字典中

while ((line_of_text = file.ReadLine()) != null)
{
    // Stuff
    full_name name = new full_name();
    if (pos > -1)
    {
        ...
        name.f_name = "NOT";
        name.l_name = "FOUND";
    }

    // Other if statements

    if (!dict.ContainsKey(user_id))
    {
        dict.Add(user_id, name);
    }
}

请您提供一些您必须解析的文件的示例(以及期望的结果)?是的,如果有希望得到您问题的答案,我们需要查看数据示例。需要查看文本文件的示例。40多年来一直在解析文本文件。它们总是很难解析,尤其是当人类打字时。编辑我的问题,将文本示例包含在文件中谢谢,这很有效。我无缘无故地把事情复杂化了。@jordan不客气。如果问题解决了,请考虑将答案标记为“接受”。
while ((line_of_text = file.ReadLine()) != null)
{
    // Stuff
    full_name name = new full_name();
    if (pos > -1)
    {
        ...
        name.f_name = "NOT";
        name.l_name = "FOUND";
    }

    // Other if statements

    if (!dict.ContainsKey(user_id))
    {
        dict.Add(user_id, name);
    }
}