将字符串分解为数组[关闭]
Posted
技术标签:
【中文标题】将字符串分解为数组[关闭]【英文标题】:breaking string into array [closed] 【发布时间】:2021-11-29 02:54:39 【问题描述】:所以我从终端读取这个:
IN-USE SSID MODE CHAN RATE SIGNAL BARS SECURITY
* example Infra 1 130 Mbit/s 71 ▂▄▆_ WPA2
example2 Infra 10 130 Mbit/s 65 ▂▄▆_ WPA2
我尝试了几种方法将其拆分为数组,以便在使用中将在 [0] 和 SSID 在 [1] 等等
但是我使用的是通过 2 个字符之间的空格数来拆分字符串,我看到最小距离是 2 个空格
但是当我读取一个在单词之间有两个空格的 SSID 时,例如:im here
它会导致中断部分出现问题,我尝试了 Split("\t") 并且没有工作
有什么建议吗?
【问题讨论】:
列似乎是固定宽度。如果是这种情况,您可以提取具有已知位置和宽度的子字符串。您可能应该从这些子字符串中删除尾随空格。 我不知道如何标记已回答,但谢谢你 “我尝试了几种方法” - 你能分享任何尝试,以便其他人可以检查它们是否有问题? 【参考方案1】:假设列是固定宽度,您可以使用此方法将单行拆分为字符串数组:
string[] ParseLine(string input) =>
new[]
input[..6].TrimEnd(),
input[8..34].TrimEnd(),
input[36..41].TrimEnd(),
input[43..47].TrimEnd(),
input[49..59].TrimEnd(),
input[61..67].TrimEnd(),
input[69..73].TrimEnd(),
input[75..].TrimEnd()
;
要拆分整个文本,您需要将其拆分为行,然后解析每一行:
var lines = text.Split('\n');
var result = lines.Select(ParseLine);
result
的值现在是包含字符串的数组序列。您可以使用foreach
枚举元素或使用ToArray()
将其转换为数组。
【讨论】:
固定宽度通常会随着某些属性变大而相应改变【参考方案2】:当某些属性变大时,固定宽度的列通常会相应地改变它们的宽度。此解决方案将字符串转换为可用于任何报告或情报的 c# 列表。所以试试这个
var headerEndIndex = origString.IndexOf("SECURITY") + "SECURITY".Length + 2;
var header = origString.Substring(0, headerEndIndex).Replace("\n", "").Replace("\r", ""); ;
var dataStringArray=origString.Substring(headerEndIndex).Split("\n");
for (var i=0; i< dataStringArray.Length; i++)
dataStringArray[i] = dataStringArray[i].Replace("\n", "").Replace("\r", "");
var ssidIndex= header.IndexOf("SSID");
var modeIndex= header.IndexOf("MODE");
var chanIndex= header.IndexOf("CHAN");
var rateIndex= header.IndexOf("RATE");
var signalIndex= header.IndexOf("SIGNAL");
var barsIndex= header.IndexOf("BARS");
var securityIndex= header.IndexOf("SECURITY");
List<SignalInfo> list= new List<SignalInfo>();
for (var i=0; i< dataStringArray.Length; i++)
var item=new SignalInfo();
item.InUse= dataStringArray[i][0] =='*';
item.Ssid=dataStringArray[i][ssidIndex..modeIndex].TrimEnd();
item.Mode=dataStringArray[i][modeIndex..chanIndex].TrimEnd();
item.Chan= Convert.ToInt32(dataStringArray[i][chanIndex..rateIndex]);
item.Rate= dataStringArray[i][rateIndex..signalIndex].TrimEnd();
item.Signal= Convert.ToInt32(dataStringArray[i][signalIndex..barsIndex]);
item.Bars= dataStringArray[i][barsIndex.. securityIndex].TrimEnd();
item.Security= dataStringArray[i].Substring(securityIndex).TrimEnd();
list.Add(item);
;
以 jason 格式输出
[
"InUse": true,
"Ssid": "example",
"Mode": "Infra",
"Chan": 1,
"Rate": "130 Mbit/s",
"Signal": 71,
"Bars": "\u2582\u2584\u2586_",
"Security": "WPA2"
,
"InUse": false,
"Ssid": "example2",
"Mode": "Infra",
"Chan": 10,
"Rate": "130 Mbit/s",
"Signal": 65,
"Bars": "\u2582\u2584\u2586_",
"Security": "WPA2"
]
类
public class SignalInfo
public bool InUse get; set;
public string Ssid get; set;
public string Mode get; set;
public int Chan get; set;
public string Rate get; set;
public int Signal get; set;
public string Bars get; set;
public string Security get; set;
【讨论】:
类似于你们俩所说的,我最终做了这样的事情:获取每个 colomm 的位置(它们是固定的,但仅在我调用命令时)意味着每次我调用命令输出它会改变,然后根据 delta x 准备好每一行,然后在列表以上是关于将字符串分解为数组[关闭]的主要内容,如果未能解决你的问题,请参考以下文章