将字符串分解为数组[关闭]

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 准备好每一行,然后在列表 的 list 中进行组织化

以上是关于将字符串分解为数组[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

错误的值 - 将大字符分解为 int 数组

如何在PHP中通过分隔符将字符串分解为多维数组

如何使用 Angular js 或 java 脚本将逗号分隔的字符串分解为单个索引数组

PHP:将 textarea 行分解为单独的数组元素

如何将用户输入的字符串逐个字符分解并放入数组中?

将数组拆分为字符串[关闭]