SCALA字组计数

时间:2018-05-22 12:00:32

标签: regex scala

2018-03-22 04:26:29.0 PM:
Daemon:
Timed Out Connections:
Live Connections:
Live Audio/Video Connections:
SIPB:124340495361123111@127.0.0.1:7
SIPB:124340495361123111@127.0.0.1:4
SIPB:124340495361123111@127.0.0.1:2
SIPB:124340495361123111@127.0.0.1:6

2018-03-23 08:05:12.0 AM:
Group Dump:
2018-03-23 08:05:42.0 AM:
2018-03-23 08:05:45.0 AM:
SIPB:7827214454065563030@127.0.0.1:3
SIPB:7827214454065563030@127.0.0.1:2
SIPB:7827214454065563030@127.0.0.1:1

2018-03-22 04:34:49.0 PM:
Daemon:
Timed Out Connections:
Live Connections:
Live Audio/Video Connections:
SIPB:124340495361123111@127.0.0.1:7
SIPB:124340495361123111@127.0.0.1:4
SIPB:124340495361123111@127.0.0.1:2
SIPB:124340495361123111@127.0.0.1:6

根据上面的示例数据,我需要计算特定日期SIPB:7827214454065563030@127.0.0.1:3字出现的次数,该日期可以在Live Connections下分组  此外,我需要打印同一组的日期时间戳。 我有关于如何统计它们的logiC,但问题是如何在组中计算它们并将3行的行打印回字符串Live Connections: Group Dump下的SIPB组不会被删除和删除。

就像产生的o / p应该是这样的,

O / P

2018-03-22 04:26:29.0 PM:
4
2018-03-22 04:34:49.0 PM:
4

我以前编码的代码总共计算cat:

val lines = Source.fromFile("/home/kafka/Downloads/newdump.txt").getLines().filter(!_.isEmpty()).mkString  
dictionary = Map( """cat:""" -> 1)
val res = dictionary.map { case(k,v) => k -> k.r.findAllIn(lines).size }

1 个答案:

答案 0 :(得分:0)

不确定您的真实数据中是否有任何其他信息可能会破坏正则表达式拆分,但这会影响您的示例数据。

首先,将输入String拆分为一个以时间戳开头的字符串列表。接下来,对于该列表中的每个元素,您需要找到cat:的实例的日期和数量并将它们一起输出。

小提琴:https://scalafiddle.io/sf/LvVDwxR/0

输出:

2018-03-22 04:26:29.0 PM:
4
2018-03-22 04:34:49.0 PM:
3

<强> 修改

真实数据包含SIPB:,然后是一堆字符,而不是cats:。在下面,Fiddle是一种修改上面代码的方法,可以为这些数据提供相同的输出。

小提琴:https://scalafiddle.io/sf/92E8wmo/0

输出:

2018-03-22 04:26:29.0 PM:
4
2018-03-22 04:34:49.0 PM:
3

编辑2

使用Alex现在提供的数据,仅使用Live Connections获取示例,您只需要过滤掉那些不包含的数据:

val input =
  """
    |2018-03-22 04:26:29.0 PM:
    |Daemon:
    |Timed Out Connections:
    |Live Connections:
    |Live Audio/Video Connections:
    |SIPB:124340495361123111@127.0.0.1:7
    |SIPB:124340495361123111@127.0.0.1:4
    |SIPB:124340495361123111@127.0.0.1:2
    |SIPB:124340495361123111@127.0.0.1:6
    |
    |2018-03-23 08:05:12.0 AM:
    |Group Dump:
    |2018-03-23 08:05:42.0 AM:
    |2018-03-23 08:05:45.0 AM:
    |SIPB:7827214454065563030@127.0.0.1:3
    |SIPB:7827214454065563030@127.0.0.1:2
    |SIPB:7827214454065563030@127.0.0.1:1
    |
    |2018-03-22 04:34:49.0 PM:
    |Daemon:
    |Timed Out Connections:
    |Live Connections:
    |Live Audio/Video Connections:
    |SIPB:124340495361123111@127.0.0.1:7
    |SIPB:124340495361123111@127.0.0.1:4
    |SIPB:124340495361123111@127.0.0.1:2
    |SIPB:124340495361123111@127.0.0.1:6
  """.stripMargin

val inputs = input.split("(?=\\d{4}-\\d{2}-\\d{2}[^\\n]*)").map(_.trim)
  .filter(_.nonEmpty).filter(_.contains("Live Connections"))

val output = inputs.map {
  x =>
    val datePattern = "(\\d{4}-\\d{2}-\\d{2}[^\\n]*)".r
    val date = (datePattern findAllIn x).toList.distinct.head
    val sipbPattern = "(?=SIPB:[^\\n]*)".r
    val sipbs = (sipbPattern findAllIn x).toList.size
    s"$date\n$sipbs"
}.mkString("\n")

小提琴:https://scalafiddle.io/sf/uwU5tSa/0

输出:

2018-03-22 04:26:29.0 PM:
4
2018-03-22 04:34:49.0 PM:
4