C# 如何在c中解析这种输出#
我有以下格式的输出C# 如何在c中解析这种输出#,c#,arrays,string,split,string-formatting,C#,Arrays,String,Split,String Formatting,我有以下格式的输出 Image Name PID Services ========================= ======== ============================================ System Idle Process 0 N/A
Image Name PID Services
========================= ======== ============================================
System Idle Process 0 N/A
services.exe 436 N/A
svchost.exe 500 BrokerInfrastructure, DcomLaunch, LSM,
PlugPlay, Power, SystemEventsBroker
vnetd.exe 18504 NetBackup Legacy Network Service
我想将输出存储在如下数组中:
ar[0]=System Idle Process
ar[1]=0
ar[2]=N/A
我试图根据空格来分割字符串,但没有成功。任何人都可以建议如何拆分此字符串并在c#中获得所需的输出。看起来您接收的信息具有固定宽度的输出,因此,您只需使用
string.Substring
即可按需获取字符串的每一部分
您可以这样读取输入中的项目:
public static IEnumerable<ProcessItem> GetItemsFromText(string text) {
var lines = text.Split( new [] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries );
ProcessItem current = null;
Console.WriteLine( "Lines found: {0}", lines.Length );
// skip first 2 lines (header and = signs)
for (int i = 2; i < lines.Length; i++) {
var name = lines[i].Substring( 0, 25 ).Trim();
var pid = lines[i].Substring( 26, 8 ).Trim();
var services = lines[i].Substring( 35 ).Trim();
if (!string.IsNullOrWhiteSpace( name ) ) {
if (current != null) {
yield return current;
}
current = new ProcessItem {
Name = name,
Pid = pid,
Services = services
};
} else {
current.Services += ' ' + services;
}
}
if (current != null) {
yield return current;
}
}
您可以在此中找到的代码的运行版本看起来您正在接收的信息具有固定宽度的输出,因此,您只需使用
string.Substring
即可获得所需的字符串部分
您可以这样读取输入中的项目:
public static IEnumerable<ProcessItem> GetItemsFromText(string text) {
var lines = text.Split( new [] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries );
ProcessItem current = null;
Console.WriteLine( "Lines found: {0}", lines.Length );
// skip first 2 lines (header and = signs)
for (int i = 2; i < lines.Length; i++) {
var name = lines[i].Substring( 0, 25 ).Trim();
var pid = lines[i].Substring( 26, 8 ).Trim();
var services = lines[i].Substring( 35 ).Trim();
if (!string.IsNullOrWhiteSpace( name ) ) {
if (current != null) {
yield return current;
}
current = new ProcessItem {
Name = name,
Pid = pid,
Services = services
};
} else {
current.Services += ' ' + services;
}
}
if (current != null) {
yield return current;
}
}
您可以在此找到的代码的运行版本请发布您的代码并定义“未解决”@Dave。。我试图在一个空白的基础上进行拆分,如formattedop=Regex.split(item,@“\s{1}”);formattedop=formattedop.Where(x=>!string.IsNullOrEmpty(x)).ToArray();但是我没有得到正确的列号如果图像名称永远不会包含数字,您可以使用以下方法:在空白处分割字符串并遍历所有部分,直到找到数字。也许你可以使用一个regex,它也在数字上分开。@royalTS..我使用了regex,但我得到的输出方式如下:ar[0]=System ar[1]=Idle ar[2]=Process ar[3]=0 ar[4]=N/ASeems就像你有固定宽度的字段(被填充),你可以根据
=
符号定义宽度,然后就这样子串它们?请发布你的代码并定义“没有成功”@Dave。。我试图在一个空白的基础上进行拆分,如formattedop=Regex.split(item,@“\s{1}”);formattedop=formattedop.Where(x=>!string.IsNullOrEmpty(x)).ToArray();但是我没有得到正确的列号如果图像名称永远不会包含数字,您可以使用以下方法:在空白处分割字符串并遍历所有部分,直到找到数字。也许你可以使用一个regex,它也在数字上分开。@royalTS..我使用了regex,但我得到的输出方式如下:ar[0]=System ar[1]=Idle ar[2]=Process ar[3]=0 ar[4]=N/ASeems就像你有固定宽度的字段(被填充),你可以根据=
符号定义宽度,然后就这样子串它们?返回数据作为可枚举对象列表而不是二维数组是一个很好的方法,但我认为如果你解释为什么这是一个好主意,这将是一个更好的答案。@RobinBennett你是对的,我可以通过解释来改进答案,但也许有一个原因,他想要的是作为一个数组。我猜OP可以决定是否需要更多信息:)这是一个很好的方法,可以将数据作为可枚举的对象列表而不是二维数组返回,但我认为如果你解释为什么这是一个好主意,这将是一个更好的答案。@RobinBennett你是对的,我可以通过解释来改进答案,但也许有一个原因,他想要的是作为一个数组。我想OP可以决定是否需要更多信息:)
public class ProcessItem {
public string Name { get; set; }
public string Pid { get;set; }
public string Services { get;set; }
}