【问题标题】:C# parse textual file in a specific formatC# 以特定格式解析文本文件
【发布时间】:2017-08-05 11:48:59
【问题描述】:

我从来没有做过这样的事情,所以我真的很好奇如何做到这一点。我想它可以通过正则表达式或在 c# 中以某种方式完成......

我有一个包含以下格式数据的文本文件:

12.23.45.56:8080:username:password
12.23.45.56:8080:username:password
12.23.45.56:8080:username:password
12.23.45.56:8080:username:password

我准备了一个如下所示的课程:

public class ParsedData
(
public string IP { get; set; }
public string Port { get; set; }
public string Username { get; set; }
public string Password { get; set; } 
)

我想要的输出是我可以单独解析每一行,并且 1 行应该将数据存储在一个解析的对象(ParsedData 列表)中;

如何做到这一点,并单独解析每一行数据?

有人可以帮帮我吗?

var completedList = text.Split(':').Select(pr => new ParsedData 
{ 
 IP = pr.ElementAt(0).ToString() // this should be the IP But I'm getting the 
// Index was outside the bounds of the array. exception in this part
/*My elements here*/

}).ToList(); 

【问题讨论】:

  • StreamReader、ReadLine、Split
  • @Rene 我想像这样使用拆分: text.Split(':').Select(pr => new ParsedData { /*My elements here*/}).ToList( );但接下来呢? XD
  • 下一步是什么?取决于你。您的 Linq 查询是正确的流程。
  • 我不会为你做研究。在您最喜欢的搜索引擎中输入关键字,大量示例应该是您的。如果你把一些不起作用的东西放在一起,请报告。
  • .Spit(':') 将返回一个包含 4 个字符串的数组 - 将第一个分配给您的 IP 属性,第二个分配给 Port

标签: c# regex parsing


【解决方案1】:

看起来至少有一行没有任何数据,也许输入数据中有一个空行?

尝试在选择数组的第一个元素之前打印出每一行数据 - 然后您可以看到哪个输入导致了异常。

【讨论】:

    【解决方案2】:

    你可以使用正则表达式(.+?):(.+?):(.+?):(.+),这里是例子:

    using System;
    using System.Text.RegularExpressions;
    using System.Collections.Generic;
    
    namespace Main {
        public struct ParsedData {
            public string IP { get; set; }
            public string Port { get; set; }
            public string Username { get; set; }
            public string Password { get; set; } 
        }
        class Prog {
            static List<ParsedData> pdl = new List<ParsedData>();
            static string file = @"12.23.425.56:90:kukur:psiar%4
    151.23.255.52:3131:Zandga:Ikurit
    52.23.45.56:5125:Ningame:Mirsga!@
    112.223.45.56:4000:Bisgo:One0ne";
            static void Main() {
                var re = new Regex(@"(.+?):(.+?):(.+?):(.+)");
                foreach (Match m in re.Matches(file)) {
                    pdl.Add(new ParsedData() { IP = m.Groups[1].Value, Port = m.Groups[2].Value, Username = m.Groups[3].Value, Password = m.Groups[4].Value });
                    Console.WriteLine("IP: " + m.Groups[1] + " PORT: " + m.Groups[2] + " USR_NM: " + m.Groups[3] + " PASS: " + m.Groups[4]);
                }
            }
        }
    }
    

    我还添加了一个包含数据的列表。

    【讨论】:

      【解决方案3】:
      class Program
          {
              static void Main(string[] args)
              {
                  //I think you know how to read the file so:
                  string text = 
      @"12.23.45.56:8080:username:password
      12.23.45.56:8080:username:password
      12.23.45.56:8080:username:password
      12.23.45.56:8080:username:password";
      
                  List<ParsedData> ps = new List<ParsedData>();
      
                  text.Split(new char[] { '\r','\n' }, StringSplitOptions.RemoveEmptyEntries).ToList().ForEach(c =>
                   {
                       var cols = c.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries).ToList();
      

      //这里也可以检查cols是否有内容

                       ps.Add(new ParsedData()
                       {
                           IP = cols[0]!=null?cols[0]:"", //and check if inside it's content..
                           Port = cols[1],
                           Username = cols[2],
                           Password = cols[3]
                       });
                   });
      
                  foreach(ParsedData p in ps)
                  {
                      Console.WriteLine(p.IP + "\t" + p.Port + "\t" + p.Username + "\t" + p.Password);
                  }
      
              }
          }
          public class ParsedData
          {
              public string IP { get; set; }
              public string Port { get; set; }
              public string Username { get; set; }
              public string Password { get; set; }
          }
      

      【讨论】:

        【解决方案4】:

        我认为你误解了 pr,它现在不是数组,它是数组中的元素。

        var text = "12.23.45.56:8080:username:password";
        var array = text.Split(':');
        var data = new ParsedData()
               {
                   IP = array[0],
                   Port = array[1],
                   Username = array[2],
                   Password = array[3]
               };
        

        【讨论】:

        • 除非您首先检查该数组是否包含 4 个元素
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多