我已经为我的个人(适合我的目的)使用了井日志 las2 文件阅读器。它有 2 个步骤 1. 创建要读取和附加的 *.las 文件列表 2. 读取 *.las 文件的数量并附加到单个数据帧中。这两个代码都在 2016 年从标准商业包创建的一组 *.las 文件上进行了测试 - 在 R 3.2.4(64 位)下的 Windows 10 中
Code-1 读取和创建 *.las 文件的简单文件列表以运行 Code-2
# Read the file having list of well-log LAS files
# Create a R-Object [wellname, path, filename] for LAS reader
# Create filelist from DOS prompt dir *.las > filelist.dat
# G Srikanth 29-May-2016
#
library(stringr)
defaultworkdir <- readline("What is the file path? ")
setwd(defaultworkdir)
welllistfile <- readline("What is the well list file? ")
listfilelines <- readLines(con = welllistfile, skipNul = TRUE)
#
# search for "Directory of " to get the LAS data folder = lasfolder
# search for "File(s)" to get the number of files = nlasfiles, linenumber
# the data file names are before the "Files(s)" line = lasfilenames() char vector of length nlasfiles
#
oneline <- listfilelines[grep("Directory of ",listfilelines)]
lasfilepath <- sub(" Directory of ","",oneline)
oneline <- listfilelines[grep(" File",listfilelines)]
# modified from http://stackoverflow.com/questions/2261079/how-to-trim-leading-and-trailing-whitespace-in-r
numberoflasfiles <- as.numeric(word(sub("^\\s+", "", oneline),1))
# file names occur from - to in the DOS list read-in
fromline <- as.numeric(grep(" File",listfilelines)) -numberoflasfiles
# extract the last word from the fromline - numberoflasfiles times and load into suitable data structure
# tail(strsplit(oneline,split=" ")[[1]],1) --- taken from
# http://stackoverflow.com/questions/17658216/extract-last-word-in-string-in-r
lasfile <- c(1:numberoflasfiles)
for (n in 1 : numberoflasfiles)
{
oneline <- listfilelines[fromline]
lasfile[n] <- tail(strsplit(oneline,split=" ")[[1]],1)
fromline=fromline+1
}
# print (lasfile)
rm(fromline)
lasfile<- paste(lasfilepath,"\\",lasfile,sep="")
# print(lasfile)
# temp <- readLines(con=lasfile[1], skipNul = TRUE)
#
save(lasfile,file="lasfiles.Rdat")
Code-2 读取许多 *.las 文件并构造单个数据框
# Read the list of lasfiles to read
# open each las file and get data
# G Srikanth 29 May 2016
# install.packages("data.table")
# 1. set working directory and read the file list
library(stringr)
library(data.table)
defaultworkdir <- readline("What is the file path? ")
setwd(defaultworkdir)
lasfilelist <- readline("What is the well list file? ")
load(lasfilelist)
welllogdata <- data.frame()
# load("lasfiles.Rdat") name of saved file
# determine number of well files
nwells <- length(lasfile)
uwi<-c(1:nwells)
# 2. Main read loop for each well las file in directory
for (wellno in 1:nwells)
{
# 2a. Get uwi
# 2b. Get curve names
# 2c. Read the curve data
# LAS files have all the headers within first 100 lines
# read 100 lines into a vector
headerlines <- readLines(con = lasfile[wellno], n=100L, ok=TRUE, skipNul = TRUE)
# extract uwi NOTE - many las files write only proper well name and not UWI. in such case replace UWI with WELL in next line
oneline <- headerlines[grep(" UWI",headerlines)]
# remove multiple spaces with gsub() extract 3rd word with word()
# ref: http://rfunction.com/archives/2354
uwi[wellno]<-word(gsub("\\s+"," ",str_trim(oneline)),3)
# extract curve information and data location
#locate ~A in the headerlines. This has the log names.
oneline <- headerlines[grep("~A",headerlines)]# line having curves names
oneline <- gsub("\\s+"," ",str_trim(oneline)) # trim leading trailing and extra blanks
ncurves <- str_count(oneline, " ")
# ncurves <- str_count(gsub("\\s+"," ",str_trim(headerlines[grep("~A",headerlines)]))," ")
# The next record in data file is numeric las data.
dataline <- as.numeric(grep("~A",headerlines)+1)
curvenameline <- as.numeric(grep("~A",headerlines)- ncurves)
# curve names start at curvenameline and contine for ncurves. The first word in each line is curve name
logname <- c(1:ncurves)
for (nc in 1:ncurves)
{
logname[nc] <- word(gsub("\\s+"," ",str_trim(headerlines[curvenameline+(nc-1)])),1)
}
# read the data matrix from the line - dataline in the well las file
# null value used in the las file
lasnull <- word(gsub("\\s+"," ",str_trim(headerlines[grep(" NULL",headerlines)])),3)
temp<- read.table(lasfile[wellno], header=F, na.strings=lasnull, skip=dataline-1, col.names = logname)
temp <- merge(temp,uwi[wellno])
names(temp) <- c(logname,"uwi")
# concatenate this data into a single data-frame. use the lognames to merge.
if (wellno == 1) welldata <- temp else welldata <- rbind.fill(welldata, temp) #rbind doesnt merge with different names, Thanks to stackoverflow!
# to clean the logname vector between files
rm(logname)
}
save(welldata,"welldata.Rdat")
希望有用!!