Groovy Преобразование строковых данных в карту - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть большая строка, которую я хочу преобразовать в карту в groovy.

Строковые данные - это массив пар ключ-значение, каждый ключ и значение которых заключены в квадратные скобки [] и разделены запятыми. Полная строка данных здесь: https://pastebin.com/raw/4rBWRzMs

Некоторые значения могут быть пустыми, например, '[]' или список значений, содержащий, и: символы, например, [1BLL:220,1BLE:641,2BLL:871,2BLE:475,SW:10029,KL:0,KD:78,ODT:148,AVB:358]

Я хочу разделить эти символы, только если они , а не заключены в квадратные скобки [].

Код, который я пробовал, но прерывается, когда есть список значений. Есть ли способ лучше? Спасибо.

String testData="[[DEVICE_PROVISIONED]: [1], [aaudio.hw_burst_min_usec]: [2000],[debug.hwui.use_buffer_age]: [false], [ro.boot.boottime][1BLL:220,1BLE:641,2BLL:871,2BLE:475,SW:10029,KL:0,KD:78,ODT:148,AVB:358], ro.boot.hardware]: [walleye],[dev.mnt.blk.postinstall]: [],[ro.boot.usbradioflag]: [0],                                                                                        [ro.boot.vbmeta.avb_version]: [1.0], [ro.boot.vbmeta.device]: [/dev/sda18], [ro.boot.vbmeta.device_state]: [unlocked]]"

def map = [:]

testData.replaceAll('\\[]','null').replaceAll("\\s","").replaceAll('\\[','').replaceAll(']','').split(",").each {param ->
    def nameAndValue = param.split(":")
    map[nameAndValue[0]] = nameAndValue[1]
}

1 Ответ

1 голос
/ 22 февраля 2020

Я бы извлек кортежи ключ-значение из этого формата и построил бы карту оттуда. Как только это будет сделано, легче будет заниматься дальнейшими преобразованиями. Например,

def testData="[DEVICE_PROVISIONED]: [1], [aaudio.hw_burst_min_usec]: [2000],[debug.hwui.use_buffer_age]: [false], [ro.boot.boottime]: [1BLL:220,1BLE:641,2BLL:871,2BLE:475,SW:10029,KL:0,KD:78,ODT:148,AVB:358], [ro.boot.hardware]: [walleye],[dev.mnt.blk.postinstall]: [],[ro.boot.usbradioflag]: [0], [ro.boot.vbmeta.avb_version]: [1.0], [ro.boot.vbmeta.device]: [/dev/sda18], [ro.boot.vbmeta.device_state]: [unlocked]"

def map = [:]
(testData =~ /\s*\[(.*?)\]\s*:\s*\[(.*?)\]\s*,?\s*/).findAll{ _, k, v ->
    map.put(k,v)
}

println map.inspect()
// → ['DEVICE_PROVISIONED':'1', 'aaudio.hw_burst_min_usec':'2000', 'debug.hwui.use_buffer_age':'false', 'ro.boot.boottime':'1BLL:220,1BLE:641,2BLL:871,2BLE:475,SW:10029,KL:0,KD:78,ODT:148,AVB:358', 'ro.boot.hardware':'walleye', 'dev.mnt.blk.postinstall':'', 'ro.boot.usbradioflag':'0', 'ro.boot.vbmeta.avb_version':'1.0', 'ro.boot.vbmeta.device':'/dev/sda18', 'ro.boot.vbmeta.device_state':'unlocked']

Обратите внимание, что я исправил некоторый синтаксис в testData и удалил внешний []. Если исходные данные testData на самом деле содержат неверный синтаксис для данных правил, это не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...