2016-02-27 76 views
0

我设法从OSX应用程序执行终端命令,但问题是数据被制表。所以我很好奇地问,如果有人知道如何解析这个数据结构,我可以从特定的行和列中获取单个值。我面对的另一个问题是,在列表数据之前有文本,我认为我需要跳过,因此我可以获取该值(我不知道)。如何在使用Swift执行NSTask命令后处理制表终端输出

这里是数据的例子。

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。我如何用Swift代码做到这一点。

请帮忙。

回答

1

我想正确的答案是要真正知道你的预期输出,然后解析出你想保留的东西(正则表达式等等来找到匹配你想要的行“我可能有一行初始输出I可以抛出,然后我总是有4列,用3个空格隔开,其中X位置的数据看起来像\ d {3}“)。这可能会更好,因此您可以处理各种情况并解决意外的结果。

但是 - 你也可以做一种坏近似的只是随意说:

  • 我有一个表示“行”
  • 我有三个空间,表示“列”一回车
  • “真实”数据将始终具有相同的列数
  • 我们不知道会有多少列,但我们将假设我们会找到“max”,然后这将定义我们的数字(例如:本例中的“真实数据”有4列,而“垃圾” “数据有一个)
  • 扔掉那些没有列

    的匹配数量的任何行

    让STDOUT =”这是非常特殊的输出,我们为此感到自豪。\ 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 100000“

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

    let rowDelimiter =“\ n”//行被回车分割 let colDelimiter =“”// cols被3个空格分割

    让行= stdOut.componentsSeparatedByString(rowDelimiter)以行

    用于行{ 让COLS = row.componentsSeparatedByString(colDelimiter) rowsAndCols.append(COLS) }

    //计数的#列,并获得最大 让maxCols = rowsAndCols.map({$ 0.count})。maxElement()

    //删除其列#比 “最大” 下找到 rowsAndCols = rowsAndCols.filter任何行( {$ 0算上== maxCols})

    //显示我们的整个输出 打印(rowsAndCols)

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

+0

感谢我不记得我如何修复它,但现在正在工作。 我可以在这里看到你正在做出好的点,那就是。 – KO55A