【问题标题】:Split a string with mixed characters and non-uniform delimiters拆分包含混合字符和非统一分隔符的字符串
【发布时间】:2020-09-25 20:05:46
【问题描述】:

我有一个程序在 Putty 中执行 df -k 命令的等效项。我在将结果字符串 lines 拆分为子字符串时遇到问题。

输入

这是我运行程序时得到的数据的摘录:

Filesystem           1024-blocks        Used   Available Capacity  Mounted on
rpool/ROOT/solaris-0    47185886    39055271     6723316    86%    /
rpool/ROOT/solaris-0/var    47185886      334036     6723316     5%    /var
/dev                           0           0           0     0%    /dev
/u01                   104857600    92783432    12074167    89%    /u01
proc                           0           0           0     0%    /proc
ctfs                           0           0           0     0%    /system/contract
mnttab                         0           0           0     0%    /etc/mnttab
swap                   333382928         536   333382392     1%    /system/volatile

预期

理想情况下,我想将上面的每一行拆分为子字符串,并将这些结果子字符串转换为模型。 .. 例如第 2 行将有 6 个这样的子字符串:

rpool/ROOT/solaris-0
47185886
39055271
6723316 
86%
/

...这些子字符串中的每一个都将被转换为具有属性的模型DiskStatistics

    public String Filesystem { get; set; }
    public double Blocks { get; set; }

    public double Used { get; set; }

    public double Available { get; set; }

    public int Capacity { get; set; }

    public string Mount { get; set; }

我尝试将其中一行(在示例控制台应用程序中)拆分如下:

string line = "rpool/ROOT/solaris-0 47185886 39055271 6723316 86% /";
        Int32 count = 6;
        String[] separator = { ", ", "" };
        String[] strlist = line.Split(separator, count,
           StringSplitOptions.RemoveEmptyEntries);
        foreach (var s in strlist)
        {
            Console.WriteLine(s);
            Console.ReadKey();
        }

但是对于输出我只能得到:

rpool/ROOT/solaris-0 47185886 39055271 6723316 86% /

我观察到原始数据中每对子串之间的空格(分隔符)也不统一。

这就是我在原始程序中获取数据的方式:

using (SshClient ssh = new SshClient("+ server IP + ",
            "+ username +", "+ password +"))
            {
               ssh.Connect();
               var result = ssh.RunCommand("df -k");
               var rss = result.Result;
               string[] lines = rss.Split('\n');
               var  stats = new List<DiskStatistics>();

               foreach (var line in lines)
               {

                //Split each line in lines into 6 substrings 
               //Cast each substring (up to 6 in each line that is split) to Model DiskStatistics

                }

            }

我怎样才能做到这一点?

【问题讨论】:

  • String[] separator = { ", ", "" }; 我不明白 - 如果输入中甚至不存在这样的分隔符,为什么还要使用它们?
  • @BartoszKP 我弄错了。我什至不知道如何用这种方法实现我的意图。我的问题在于我的数据中的空格分隔符不统一。一些子字符串有 3 个分隔它们的空格,有的有 4 个,以此类推。而那个实现geeksforgeeks.org/string-split-method-in-c-sharp-with-examples 是我迄今为止最接近实现我的目标..
  • String[] separator = { " " }; String[] strlist = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
  • @Golide Retired Ninja 所说的是您所描述的事情的解决方案,但它仍然与您的代码不匹配 - line 中没有多个分隔符 - 每个条目都被单个空格包围.所以目前还不清楚你想在那里展示什么。
  • @BartoszKP 是的,我刚刚验证过。它的分裂很好。我错误地粘贴了行。我已经修改并测试了数据集中的所有行

标签: c# arrays substring


【解决方案1】:

如果您知道空格是您的分隔符,但使用的空格数量未知,则一种选择是在 C# 中将 Match 类与 Regex 库一起使用:

例子:


foreach (var line in lines)
{
  // Creates an array of results that are non-whitespace.
  var m = Regex.Match(line, @"(\S+)"); 

  for (int i = 1; i <= m.Groups.Count; i++)
  {
    Console.WriteLine($"{m.Groups[i].Value}");
  }
}

额外好处:它还可以处理用户使用制表符而不是空格的情况!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多