【问题标题】:Howto read file into collection string to create a xml in C#如何将文件读入集合字符串以在 C# 中创建 xml
【发布时间】:2016-11-30 09:01:46
【问题描述】:

首先我想从简单的 txt 文件中读取和存储有关人员的信息。

文件看起来像这样,例如

person=3
name=Tigan 
sirname=Cenk 
id=1231 
nationality=whatever
name2=Joo
sirname2=Boo 
id2=1299
nationality2=whatever
<optinal>=whatever
name3=Joo
sirname3=Boo 
id3=1211
nationality3=whatever

我创建了一个类似以下示例的人员类:

class Person
    {
        public string name { get; set; }
        public string sirname { get; set; }
        public int id { get; set; }
        public string nationality { get; set; }
     }

然后使用以下代码从文件中读取行:

List<string> lines = File.ReadAllLines(Path2File).ToList();
List<Person> list = new List<Person>();

之后我用分隔符“=”分割线

foreach (var line in lines)
   {
   Char delimiter = '=';
   string[] contents = line.Split(delimiter);
   }

现在我的问题是,我如何将内容“[1]”(例如 Tigan)传递到我的集合数组 contetns“[0]”(例如 name 或 name1)上的正确位置到 person.name

我需要返回包含所有数据的列表以使用它来创建 xml。

我希望有人可以帮助我。

亲切的问候。

【问题讨论】:

  • 你能更改文本文件吗?使用 json 会简单得多。
  • 每个文本文件是否只包含 1 个人?还是一个包含很多人和信息的大文本文件?
  • @HebeleHododo - 不,我不能更改文本文件,它们必须保留。
  • @Fuzzybear - 文件可以包含 1 人或多人(无限制)
  • 那么文件中的每个人之间是否有分隔符?他们是否都有与每个人关联的相同数据?还是缺少行。即 sirname2= 是否会单独一行作为空白?

标签: c# xml arraylist io


【解决方案1】:
for (int i=1; i < lines.Length; i+=4)
{
    Person person = new Person();
    person.name = lines[i].Split('=')[1];
    person.sirname = lines[i+1].Split('=')[1];
    person.id = lines[i+2].Split('=')[1];
    person.nationality = lines[i+3].Split('=')[1];

    list.Add(person);
}

您可以循环带有 4 个元素间隙的行,并在循环中获取所有 4 行并将它们添加到 person 类。您必须以索引 1 开始循环行,因为您的第一个元素不是类的一部分!

【讨论】:

  • 不错的方法。我只需要处理一些不仅仅是 4 个元素的人。例如其中一些将邮政编码作为最后一个元素。我尝试解决它会给出反馈。
【解决方案2】:

我会选择这样的:

var person = new Person();
foreach (var line in lines)
   {
   Char delimiter = '=';
   string[] contents = line.Split(delimiter);
   switch(contents[0])       
      {         
         case "id":  
            if(person.id != Convert.ToInt32(contents[1]) && person.name != null)
               {
                   list.Add(person);
                   person = new Person();
               }
            person.id = Convert.ToInt32(contents[1]);
            break;  
         case "name ":   
            person.name = contents[1];
            break;  
         case "sirname":            
            person.sirname = contents[1];
            break; 
        //...etc
       }
   }

【讨论】:

  • 感谢您的访问!但我不明白该部分将如何工作:case "person": if(person.id != Convert.ToInt32(contents[1])) { list.Add(person); person = new Person(); } person.id = Convert.ToInt32(contents[1]); break; 在您的情况下,它将 3 与任何人的 id 进行比较,并且不会匹配。所以所有列表都是空的,因为 person 是文件的第一个元素。
  • 对不起,我认为顶部的人对于每个人来说都是独一无二的,我认为它需要是 id。我将编辑我的答案,只需要检查大小写“id”
  • 抱歉没有看到其他问题,让我再看看
  • @CenkTigan 好的,现在应该会更好,通过检查 && person.name != null 您现在应该只添加完全填充的人员类。
  • 谢谢!另一个问题是一个人之后的情况不匹配,因为一个元素的名称,例如第二个人的名称更改为 name1。现在我用 if 子句实现了它:if (contents[0].StartsWith("name")) { person.name = contents[1]; } if (contents[0].StartsWith("sirname")) { person.sirname = contents[1]; } if (contents[0].StartsWith("id")) { person.id = contents[1]; }
【解决方案3】:

感谢两位的支持!如果有人感兴趣,这是我使用的一种可能的解决方案:

    var person = new Person();
    for (int i=1; i < lines.Count; i+=12)
        {
            if (lines[i].StartsWith("name"))
            {
                person.name = lines[i].Split('=')[1];

            }
            if (lines[i+1].StartsWith("sirname"))
            {
                person.sirname = lines[i+1].Split('=')[1];

            } 
            if (lines[i+2].StartsWith("id"))
            {
                person.id = lines[i+2].Split('=')[1];

            }
            if (lines[i+3].StartsWith("nationality"))
            {
                person.nationality = lines[i+3].Split('=')[1];

            }
            try //optional element
            {
                if (lines[i + 4].StartsWith("whatever"))
                {
                    person.whatever = lines[i + 4].Split('=')[1];
                    i += 1;
                    list.Add(person);
                    person = new Person();
                    continue;
                }
                else
                {
                    break; //fileformat not supported
                }
           catch 
           {
                list.Add(person);
                person = new Person();
            }
        }

亲切的问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2016-10-25
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多