file.size()函数返回文件的大小(以字节为单位)。我们如何将返回的字节转换为相应的KB、MB、GB或TB?
例如:
255Bytes = 255B
19697Bytes = 19.24KB
13230426Bytes = 12.62MB
file.size()函数返回文件的大小(以字节为单位)。我们如何将返回的字节转换为相应的KB、MB、GB或TB?
例如:
255Bytes = 255B
19697Bytes = 19.24KB
13230426Bytes = 12.62MB
我们可以尝试使用dplyr
包中的case_when
函数来进行暴力处理:
library(dplyr)
input <- 123456 # numerical input as number of bytes
output <- case_when(
input < 1000 ~ paste0(input, "B"),
input < 1000000 ~ paste0(input / 1000, "KB"),
input < 1000000000 ~ paste0(input / 1000000, "MB"),
input < 1000000000000 ~ paste0(input / 1000000000, "GB"),
input < 1000000000000000 ~ paste0(input / 1000000000, "TB"),
TRUE ~ paste0(input, "B") # for anything larger than 999TB, just report bytes
)
output
[1] "123.456KB"
我在其他编程语言中找到了各种解决方案。但是这篇文章提供了由@Rohit Jain建议的工作良好的解决方案。通过实施小的调整,我将其应用于一个R函数:
file_size_formated <- function(size){
k = size/1024.0 ^ 1
m = size/1024.0 ^ 2
g = size/1024.0 ^ 3
t = size/1024.0 ^ 4
if (t > 1) {
outSize = paste0(round(t,2),"TB")
} else if (g > 1) {
outSize = paste0(round(g,2),"GB")
} else if (m > 1) {
outSize = paste0(round(m,2),"MB")
} else if (k > 1) {
outSize = paste0(round(k,2),"KB")
} else{
outSize = paste0(round(size,2),"B")
}
return(outSize)
}
假设您想获取设备上“www”文件夹中所有文件的文件大小:
# Normal output
file.size(list.files("www",full.names = TRUE))
[1] 255 307 856 1205 1038 5940 250 3940 328 1593 53938 59061210 3750711 16251 42756
[16] 6709 19697 13230426
# Function Output
sapply(file.size(list.files("www",full.names = TRUE)),file_size_formated)
[1] "255B" "307B" "856B" "1.18KB" "1.01KB" "5.8KB" "250B" "3.85KB" "328B" "1.56KB" "52.67KB" "56.33MB" "3.58MB" "15.87KB"
[15] "41.75KB" "6.55KB" "19.24KB" "12.62MB"
KMG(c(255, 19697, 13230426), suffix="B", standard="legacy")
并获得[1] "255B" "19.7KB" "13.2MB"
。 - r2evansutils:::format.object_size
函数来绕过这个问题 - 例如utils:::format.object_size(file.size("filename.r"), "Mb")
可以转换为“B”、“kB”、“MB”、“GB”、“TB”、“PB”、“EB”、“ZB”、“YB”、“KiB”、“MiB”、“GiB”、“TiB”、“PiB”、“EiB”、“ZiB”、“YiB”、“b”、“Kb”、“Mb”、“Gb”、“Tb”、“Pb” 和 “KB”。 - thelatemail