从数字字符串中仅提取一些数字
Extracting from numerical string only some digits
我有一个装满光栅文件的文件夹。它们以 12 个一组的形式出现,其中每个都是 Sentinel 2 卫星的一个波段(有 12 个波段)。我只想创建一个循环遍历文件夹并首先确定我感兴趣的两个波段(乐队 4 和 5)。为了从同一组中成对处理它们,我试图从 Band 4 中提取字符串中照片的日期,我将使用它从同一日期检索 Band 5;
问题来了。 名称是这样的:T31UER_20210722T105619_B12.jp2,但我设法只从中提取数字并去掉了 31这给了我:20190419105621042
那么我的问题的核心就是,我怎么能select只是这个字符串的一小部分(YYYY/MM/DD)呢?
这是一段代码。如您所见,我的方法是 select 我要删除的部分。但它不适用于第二步,因为日期之后的部分一直在变化,除了 042。
非常感谢!
for (f in files){
#Load band 4
Bande4 <- list.files(path="C:/Users/Perrin/Desktop/INRA/Raster/BDA/Images en vrac",
pattern ="B04.jp2$", full.names=TRUE)
#Copy the date
x <- gsub("[A-z //.//(//)]", "", Bande4)
y <- gsub("31", "", x)
z <- gsub("??? this part changes for every file!", "", y)
#Load the matching Band 5
Bande5 <- list.files(path="C:/Users/Perrin/Desktop/INRA/Raster/BDA/Images en vrac",
pattern = z, full.names=TRUE)
#Calculate NDVI
NDVI <- ((Bande5 - Bande4)/(Bande5- Bande4))
#Save the result
r4 <- writeRaster(z, "C:/Users/Perrin/Desktop/INRA/Raster/BDA/Images en vrac", format="GTiff", overwrite=TRUE)
}
你可以 select 日期,因为它是一个 8 位长的字符串,介于下划线和大写字母之间(这里我假设它总是“T”)
str <- "T31UER_20210722T105619_B12.jp2"
sub("(.*_)([[:digit:]]{8})(T.*)", "\2", str)
#> [1] "20210722"
我将字符串描述为正则表达式,只收集它的第二部分(部分由括号分隔)。
我希望它能匹配你所有的光栅!
您可以使用 substr
从字符串中提取某些字符,例如:
substr(z, 1, 8)
[1] "20210722"
如果您的名字总是采用相同的格式,您可以直接使用 substr
而无需先使用 gsub
:
substr(Bande4, 8, 15)
# e.g. with
substr("T31UER_20210722T105619_B12.jp2", 8, 15)
[1] "20210722"
我有一个装满光栅文件的文件夹。它们以 12 个一组的形式出现,其中每个都是 Sentinel 2 卫星的一个波段(有 12 个波段)。我只想创建一个循环遍历文件夹并首先确定我感兴趣的两个波段(乐队 4 和 5)。为了从同一组中成对处理它们,我试图从 Band 4 中提取字符串中照片的日期,我将使用它从同一日期检索 Band 5;
问题来了。 名称是这样的:T31UER_20210722T105619_B12.jp2,但我设法只从中提取数字并去掉了 31这给了我:20190419105621042
那么我的问题的核心就是,我怎么能select只是这个字符串的一小部分(YYYY/MM/DD)呢?
这是一段代码。如您所见,我的方法是 select 我要删除的部分。但它不适用于第二步,因为日期之后的部分一直在变化,除了 042。 非常感谢!
for (f in files){
#Load band 4
Bande4 <- list.files(path="C:/Users/Perrin/Desktop/INRA/Raster/BDA/Images en vrac",
pattern ="B04.jp2$", full.names=TRUE)
#Copy the date
x <- gsub("[A-z //.//(//)]", "", Bande4)
y <- gsub("31", "", x)
z <- gsub("??? this part changes for every file!", "", y)
#Load the matching Band 5
Bande5 <- list.files(path="C:/Users/Perrin/Desktop/INRA/Raster/BDA/Images en vrac",
pattern = z, full.names=TRUE)
#Calculate NDVI
NDVI <- ((Bande5 - Bande4)/(Bande5- Bande4))
#Save the result
r4 <- writeRaster(z, "C:/Users/Perrin/Desktop/INRA/Raster/BDA/Images en vrac", format="GTiff", overwrite=TRUE)
}
你可以 select 日期,因为它是一个 8 位长的字符串,介于下划线和大写字母之间(这里我假设它总是“T”)
str <- "T31UER_20210722T105619_B12.jp2"
sub("(.*_)([[:digit:]]{8})(T.*)", "\2", str)
#> [1] "20210722"
我将字符串描述为正则表达式,只收集它的第二部分(部分由括号分隔)。
我希望它能匹配你所有的光栅!
您可以使用 substr
从字符串中提取某些字符,例如:
substr(z, 1, 8)
[1] "20210722"
如果您的名字总是采用相同的格式,您可以直接使用 substr
而无需先使用 gsub
:
substr(Bande4, 8, 15)
# e.g. with
substr("T31UER_20210722T105619_B12.jp2", 8, 15)
[1] "20210722"