Как извлечь последнее значение перед последним: символ, но после последней запятой? - PullRequest
1 голос
/ 26 июля 2011

Я использую Clojure для анализа и анализа файлов XML.
Вот пример:

BSS:17,NSVC:1
BSS:17,NSVC:4
BSS:17,NSVC:5
BSS:17,BTSM:0,BTS:3
BSS:17,BTSM:0,BTS:4
BSS:17,BTSM:0,BTS:5
BSS:17,BTSM:1,BTS:0
BSS:17,BTSM:1,BTS:1
BSS:17,BTSM:1,BTS:2
BSS:17,BTSM:1,BTS:3

Меня интересует это последнее значение (значение после последней запятой, но передlast:, NSVS и BTS в моем случае), цифры после них не имеют значения.
Как извлечь это последнее значение в предыдущих строках?

Ответы [ 3 ]

3 голосов
/ 26 июля 2011

Вы можете использовать эту функцию для обработки отдельных строк:

(defn lastval [s]
  (second (re-find #",([^,:]+):\d*$" s)))
                 ;   ^ the comma preceding the interesting section
                 ;    ^ the part in parens will be captured as a group
                 ;     ^ character class meaning "anything except , or :"
                 ;            ^ the colon after the interesting section
                 ;             ^ any number of digits after the colon
                 ;                ^ end of string
          ; ^ returns a vector of [part-that-matches, first-group];
          ;   we're interested in the latter, hence second

Примечание.это возвращает nil, если регулярное выражение не совпадает.

Например:

user> (lastval "BSS:17,BTSM:0,BTS:3")
"BTS"

Если позже вы захотите извлечь всю информацию в виде простых в работе битов, выможно использовать

(defn parse [s]
  (map (juxt second #(nth % 2)) (re-seq #"(?:^|,)([^,:]+):(\d+)" s)))

Например

user> (parse "BSS:17,BTS:0,BTS:3")
(["BSS" "17"] ["BTS" "0"] ["BTS" "3"])
0 голосов
/ 26 июля 2011

Это у вас работает?


(def tmp (str "BSS:17,NSVC:1\n
BSS:17,NSVC:4\n
BSS:17,NSVC:5\n
BSS:17,BTSM:0,BTS:3\n
BSS:17,BTSM:0,BTS:4\n
BSS:17,BTSM:0,BTS:5\n
BSS:17,BTSM:1,BTS:0\n
BSS:17,BTSM:1,BTS:1\n
BSS:17,BTSM:1,BTS:2\n
BSS:17,BTSM:1,BTS:3\n"))


(defn split [s sep]
  (->> (.split s sep)
       seq
       (filter #(not (empty? %)))))

(reduce (fn[h v]
          (conj h (last v)))

          [] (map #(split % ",")
                  (split tmp "\n")))

Я предполагаю, что между линиями есть какой-то разделитель.

0 голосов
/ 26 июля 2011

Можете ли вы использовать lastIndexOf , чтобы найти последнюю запятую?

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