2014-03-24 30 views
1

我有一些Python代码,处理相当复杂的哈希映射(示例输入),重构它并创建(例如输出)它的简化版本。我正在寻找用Scala解决这个问题的最佳方法,即内置或外部库?我对Scala很陌生,只是开始处理它,所以这里的一些指导将会非常有用。斯卡拉 - 重新格式化哈希映射

这很容易做到使用Python,我希望这将是与斯卡拉。

输入:

data_in = { 
    'map': { 
     'stats': { 
      'uphosts': u'3', 
      'timestr': u'Thu Mar 20 18:18:09 2014', 
      'downhosts': u'0', 
      'totalhosts': u'3', 
      'elapsed': u'1.71' 
     }, 
     'scaninfo': { 
      u'tcp': { 
       'services': u'80,443', 
       'method': u'syn' 
      } 
     }, 
     'command_line': u'command goes here' 
    }, 
    'scan': { 
     u'2a00:2384:0:208f::15': { 
      'status': { 
       'state': u'up', 
       'reason': u'nd-response' 
      }, 
      'hostname': u'static.xyz.com', 
      'vendor': { 
       u'00:0C:67:99:6f:96': u'VMware' 
      }, 
      'addresses': { 
       u'mac': u'00:gf:29:99:6D:96', 
       u'ipv6': u'a848:2384:0:3456::15' 
      }, 
      u'tcp': { 
       80: { 
        'product': '', 
        'state': u'open', 
        'version': '', 
        'name': u'http', 
        'conf': u'3', 
        'extrainfo': '', 
        'reason': u'syn-ack', 
        'cpe': '' 
       }, 
       443: { 
        'product': '', 
        'state': u'open', 
        'version': '', 
        'name': u'https', 
        'conf': u'3', 
        'script': { 
         u'ssl-cert': u'place holder' 
        }, 
        'extrainfo': '', 
        'reason': u'syn-ack', 
        'cpe': '' 
       } 
      } 
     }, 
     u'2a00:2384:0:208f::16': { 
      'status': { 
       'state': u'up', 
       'reason': u'nd-response' 
      }, 
      'hostname': u'static.edf.com', 
      'vendor': { 
       u'00:0C:55:AE:33:ff': u'VMware' 
      }, 
      'addresses': { 
       u'mac': u'00:54:29:fg:55:0F', 
       u'ipv6': u'8938:8584:0:8685::16' 
      }, 
      u'tcp': { 
       80: { 
        'product': '', 
        'state': u'open', 
        'version': '', 
        'name': u'http', 
        'conf': u'3', 
        'extrainfo': '', 
        'reason': u'syn-ack', 
        'cpe': '' 
       }, 
       443: { 
        'product': '', 
        'state': u'open', 
        'version': '', 
        'name': u'https', 
        'conf': u'3', 
        'script': { 
         u'ssl-cert': u'place holder' 
        }, 
        'extrainfo': '', 
        'reason': u'syn-ack', 
        'cpe': '' 
       } 
      } 
     } 
    } 
} 

需要的输出:

data_out_1 = [ 
    {'address': u'2a00:2384:0:208f::15', 
    'hostname': u'static.xyz.com', 
    'ports': {80: {'reason': u'syn-ack', 'state': u'open'}, 
      443: {'reason': u'syn-ack', 
        'ssl_cert': u'place holder', 
        'state': u'open'}}}, 
    {'address': u'2a00:2384:0:208f::16', 
    'hostname': u'static.edf.com', 
    'ports': {80: {'reason': u'syn-ack', 'state': u'open'}, 
      443: {'reason': u'syn-ack', 
        'ssl_cert': u'place holder', 
        'state': u'open'}}}]  

回答

8

那不是类型安全的。

散列图不能存储不同类型的数据*。首先创建数据结构来保存输入数据(case classes将在这里帮助)。

所以你的统计对象可能看起来像

case class Stats(uphosts: Int, timeStr: Datetime, downhosts: Int, totalHosts: Int, elapsed:Double) 
  • 这里忽略亚型的时刻。
+4

肯定+1。养成为你处理的所有事情生成域抽象的习惯。字典对于结构化数据是非常可怕的(除非它是一本字典,当然......)。 –

+2

值得注意的是,这个建议不是scala特有的。 *无论您使用何种语言*,包括* python,巨型疯狂词典都是一个糟糕的主意。 – dhg