我有一个程序执行与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
}
}
我该如何实现?
[如果您知道空格是分隔符,但是使用的空格数量未知,一种选择是将Match
类与C#中的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}");
}
}
额外好处:它还可以处理用户使用制表符而不是空格的情况!