Разбиение строки на подстроки фиксированной длины


У меня есть функции в Clojure вот что предназначается, чтобы разобрать строку вида:

"DDXXXYYY"

где ДД должен быть отброшен, и XXX и YYY являются строковыми представлениями чисел.

(defn split-id [tileid]
  (map #(Integer/parseInt %)
       (map (partial apply str)
            (partition 3 (drop 2 tileid)))))

Или, написано с резьбы макрос:

(defn split-id [tileid]
  (map #(Integer/parseInt %)
       (map (partial apply str)
            (->> tileid (drop 2) (partition 3)))))

У кого-нибудь есть рекомендации для простой способ сделать это? Он чувствует, как в Clojure.ВНО.строки должны иметь раздел функцию, которая принимает строку и целое число.

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

(defn parse-ints
  "Converts all strings in the supplied collection to their integer
  representation."
  [coll]
  (map #(Integer/parseInt %) coll))

(def res-map
  ^{:doc "Map between the second digit in a MODIS TileID
metadata value and the corresponding resolution."}
  {:1 "1000"
   :2 "500"
   :4 "250"})

(defn tileid->res
  "Returns a string representation of the resolution referenced by the
supplied MODIS TileID."
  [tileid]
  (res-map (keyword (subs tileid 1 2))))

(defn tileid->xy
  "Extracts integer representations of the MODIS X and Y coordinates
referenced by the supplied MODIS TileID."
  [tileid]
  (parse-ints
   (map (partial apply str)
        (partition 3 (subs tileid 2)))))

(defn split-id
  "Returns a sequence containing the resolution, X and Y
  coordinates (on the MODIS grid) referenced by the supplied MODIS
  TileID."
  [tileid]
  (flatten
   ((juxt tileid->res
          tileid->xy) tileid)))


1659
7
задан 5 февраля 2011 в 08:02 Источник Поделиться
Комментарии
1 ответ

Вы могли бы попробовать следующее, С помощью метода substring Java и вектор смещения:

(defn split-id [tileid]
(map
#(Integer. (.substring tileid % (+ % 3)) )
[2 5]))

2
ответ дан 6 февраля 2011 в 12:02 Источник Поделиться