функция / библиотека для преобразования _из_ читаемого человеком размера в размер байта? - PullRequest
0 голосов
/ 19 июня 2020

Я знаю, что есть gdata::humanReadable(), который преобразует 10000 в "9.8 KiB" et c. - а как насчет обратного преобразования? Я уверен, что он тоже должен быть, но не могу найти его с помощью быстрого поиска.
Пока что я использую свое собственное быстрое и грязное решение:

get_size_bytes <- function(inpstr){
  sizes <- c(kB =1000,
             kiB=2^10,
             MB =1e3^2,
             MiB=(2^10)^2)

  suffix <- gsub( '[\\.0-9]+ ?',   '',   inpstr)
  number <- gsub('([\\.0-9]+) ?.*','\\1',inpstr)
  mult <- sizes[suffix]

  return(unname(as.numeric(number)*mult))
}

# usage example:
get_size_bytes(c('100.1 MB', '9 kB', '10 kB', '9 xx'))
# [1] 100100000      9000     10000        NA

1 Ответ

0 голосов
/ 19 июня 2020

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

Вот предложение, которое заменит удобочитаемые числа на длинные числа столько раз, сколько они могут появляться в любом количестве строк, которое вы передаете ему.

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

Если вам интересно, я вывел known с

# adapted from utils:::format.object_size
known_units <- list(
  SI = c("B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"),
  IEC = c("B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"),
  legacy = c("b", "Kb", "Mb", "Gb", "Tb", "Pb"),
  LEGACY = c("B", "KB", "MB", "GB", "TB", "PB"))
known_bases <- c(SI = 1000, IEC = 1024, legacy = 1024, LEGACY = 1024)
known <- Map(function(un, ba) setNames(ba^(seq_along(un)), un),
             known_units, known_bases)
for (i in seq_along(known)[-1]) {
  nms <- names(known[[i]])
  known[[i]] <- known[[i]][ nms[ ! nms %in% unlist(lapply(known[1:(i-1)], names)) ] ]
}
known <- unlist(unname(known))

Возможно, Kludgy, но я знаю, могу ли я не делал это программно, я бы пропустил запятую или что-то в этом роде.

Расширение этой функции может принимать некоторые format -подобные аргументы, такие как big.mark=, small.mark=, и c. А еще лучше в качестве сопутствующей функции, которая «находит» числа (предположительно после вызова этой функции) и вставляет запятые, et c.

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