使用 Swift 执行 NSTask 命令后如何处理制表终端输出

How to handle tabulated terminal output after NSTask command execution with Swift

我设法从 OSX 应用程序执行终端命令,但问题是数据是表格化的。所以我想问问是否有人知道如何将其解析为某种数据结构,从那里我可以在特定的行和列中获取单个值。我面临的另一个问题是在表格数据之前有 text,我想我需要跳过它以便我可以获取值(我不知道)。

这是数据示例。

this is very special output and we are proud of it.
0x0032   099   099   000
0x0032   099   099   000
0x0013   099   099   000
0x0013   122   100   010
0x0032   100   100   010
0x0032   100   100   010
0x0013   100   100   010
0x0032   100   100   000

例如,我需要获取值:122,它位于从左到右的第 4 行第 2 列。我如何使用 Swift 代码做到这一点。

请帮忙。

我想正确的答案是真正了解您的预期输出,然后解析出您想要保留的内容(正则表达式等,以找到与您想要的相匹配的行 "I might have a line of initial output I can throw out. Then I always have 4 columns, separated by 3 spaces where data in X position looks like \d{3}")。这可能会更好,这样您就可以处理各种情况并解决意外结果。

但是 - 你也可以通过任意说来做一种不好的近似:

  • 我有一个马车 returns 表示 "rows"
  • 我有三个空格表示 "columns"
  • "real" 数据将始终具有相同的列数
  • 我们不知道会有多少列,但我们假设我们会找到 "max" 然后这将定义我们的数字(例如:"real data" 在这个例子中有 4 列,而 "junk" 数据有一个)
  • 丢弃所有列数不匹配的行

    让 stdOut = "this is very special output and we are proud of it.\n0x0032 099 099 000\n0x0032 099 099 000\n0x0013 099 099 000\n0x0013 122 100 010\n0x0032 100 100 010\n0x0032 100 100 010\n0x0013 100 100 010\n0x0032 100 100 000"

    var rowsAndCols: [[String]] = [[]]

    let rowDelimiter = "\n" //行以回车分隔 return let colDelimiter = " " //cols被3个空格分隔

    让行数 = stdOut.componentsSeparatedByString(rowDelimiter)

    行中行{ 让 cols = row.componentsSeparatedByString(colDelimiter) rowsAndCols.append(列) }

    //计算列数并得到最大值 让 maxCols = rowsAndCols.map({$0.count}).maxElement()

    //删除所有 # 列低于找到的 "max" 的行 rowsAndCols = rowsAndCols.filter({$0.count == maxCols})

    //显示我们的全部输出 打印(行和列)

    让 someVal = rowsAndCols[0][0] 打印(someVal)