Scala拆分字符串和排序数据

时间:2014-09-18 12:25:57

标签: string scala split

您好我是scala的新手,我在scala中实现了以下内容,我的字符串包含以下数据

CLASS: Win32_PerfFormattedData_PerfProc_Process$$(null)|CreatingProcessID|Description|ElapsedTime|Frequency_Object|Frequency_PerfTime|Frequency_Sys100NS|HandleCount|IDProcess|IODataBytesPersec|IODataOperationsPersec|IOOtherBytesPersec|IOOtherOperationsPersec|IOReadBytesPersec|IOReadOperationsPersec|IOWriteBytesPersec|IOWriteOperationsPersec|Name|PageFaultsPersec|PageFileBytes|PageFileBytesPeak|PercentPrivilegedTime|PercentProcessorTime|PercentUserTime|PoolNonpagedBytes|PoolPagedBytes|PriorityBase|PrivateBytes|ThreadCount|Timestamp_Object|Timestamp_PerfTime|Timestamp_Sys100NS|VirtualBytes|VirtualBytesPeak|WorkingSet|WorkingSetPeak|WorkingSetPrivate$$(null)|0|(null)|8300717|0|0|0|0|0|0|0|0|0|0|0|0|0|Idle|0|0|0|100|100|0|0|0|0|0|8|0|0|0|0|0|24576|24576|24576$$(null)|0|(null)|8300717|0|0|0|578|4|0|0|0|0|0|0|0|0|System|0|114688|274432|17|0|0|0|0|8|114688|124|0|0|0|3469312|8908800|311296|5693440|61440$$(null)|4|(null)|8300717|0|0|0|42|280|0|0|0|0|0|0|0|0|smss|0|782336|884736|110|0|0|1864|10664|11|782336|3|0|0|0|5701632|19357696|1388544|1417216|700416$$(null)|372|(null)|8300715|0|0|0|1438|380|0|0|0|0|0|0|0|0|csrss|0|3624960|3747840|0|0|0|15008|157544|13|3624960|10|0|0|0|54886400|55345152|5586944|5648384|2838528$$(null)|424|(null)|8300714|0|0|0|71|432|0|0|0|0|0|0|0|0|csrss#1|0|8605696|8728576|0|0|0|8720|96384|13|8605696|9|0|0|0|50515968|50909184|7438336|9342976|4972544

现在我想查找值为PercentProcessorTime, ElapsedTime,..的数据所以为此,我首先拆分字符串$$,然后再次使用|拆分字符串,这个新的拆分字符串我搜索了字符串使用索引的PercentProcessorTime' presents and get Index of that string when I get string then skipped first two arrays which split from $$ and get data of PercentProcessorTime`,看起来很复杂,但我认为以下代码应该有帮助

//首先拆分字符串,如下所示

val processData = winProcessData.split("\\$\\$")


// get index here
  val getIndex: Int = processData.find(part => part.contains("PercentProcessorTime"))
  .map {
    case getData =>
      getData

  } match {
    case Some(s) => s.split("\\|").indexOf("PercentProcessorTime")
    case None => -1
  }
 val getIndexOfElapsedTime: Int = processData.find(part => part.contains("ElapsedTime"))
  .map {
    case getData =>
      getData

  } match {
    case Some(s) => s.split("\\|").indexOf("ElapsedTime")
    case None => -1
  }
 // now fetch data of above index as below
for (i <- 2 to (processData.length - 1)) {
    val getValues = processData(i).split("\\|")
    val getPercentProcessTime = getValues(getIndex).toFloat
    val getElapsedTime = getValues(getIndexOfElapsedTime).toFloat
    Logger.info("("+getPercentProcessTime+","+getElapsedTime+"),")
  }

现在问题是使用上面的代码我在索引中获取给定键的数据,所以我的输出是(8300717,100),(8300717,17)(8300717,110)...现在我想使用getPercentProcessTime对这些数据进行排序,所以我的输出应该是{{1} } 并且该数据应该在列表中,因此我将列表传递给案例类。

1 个答案:

答案 0 :(得分:0)

您是否找到了PercentProcessorTimePercentPrivilegedTime? 这是

val str = "your very long string"
val heads = Seq("PercentPrivilegedTime", "ElapsedTime")
val Array(elap, perc) = str.split("\\$\\$").tail.map(_.split("\\|"))
                           .transpose.filter(x => heads.contains(x.head))
//elap: Array[String] = Array(ElapsedTime, 8300717, 8300717, 8300717, 8300715, 8300714)
//perc: Array[String] = Array(PercentPrivilegedTime, 100, 17, 110, 0, 0)
val res = (elap.tail, perc.tail).zipped.toList.sortBy(-_._2.toInt)
//List[(String, String)] = List((8300717,110), (8300717,100), (8300717,17), (8300715,0), (8300714,0))