Is there an R package for analyzing Log Ascii Standard geophysical files (.las files)?

Is there an R package that can read .las files, i.e. Schlumberger log ascii standard files?
It should be able to read las 2.0 files.

Note:

  • I am not talking about LIDAR.las files here.
  • I am talking about geophysical well log files (not log files for computer applications, demons, etc.).

Searching R and Las and Logfiles on the Internet gives me too many red herrings.

Updates from comments:

I also consider scripts or APIs that can use language bindings for R.

So far I have found the following scripts:

However, all these scenarios so far do not seem to me very mature.

There is also a free Schlumberger Log Data Toolbox "software package, but it only works under Windows and may have compatibility issues, -english Windows versions (if I remember correctly).

There is a comprehensive java applet from the Kansas geological service, but it is a bit dull for large .las input files.

There is a project and this link for a good set of examples of las files.

+7
source share
3 answers

Answering my own question:

Now there is a python library, lasio , which works pretty well. This can be called from R , possibly through the system2 () function; and the output can be extracted into the data structures of R. Another possibility would be to serialize the lasfile objects in JSON, save to a file and reimport from R. Perhaps I will continue this answer with a sample code, but now I do not have time.

+3
source

Example * .las file:

… … … #MNEM .UNIT API CODE :DESCRIPTION #---- ------ -------------- ----------------------------- DEPT .ft : Station Depth INCL .deg : Hole inclination AZIM .deg : Measured Azimuth #------------------------------------------------------------- # DEPT INCL AZIM ~ASCII 0.00 0.00 0.00 36.00 0.33 123.98 126.00 0.17 183.28 218.00 0.19 202.04 308.00 0.24 191.24 398.00 0.21 198.60 495.00 0.02 179.55 … … … 

The goal when reading a file is to ignore the file heading and copy only the data that appeared after the line (~ASCII) , in addition, each column heading Thus, we copy the entire file and search it one by one until we reach the line (~ ASCII), then copy the line in front of it (header) and everything that appears after it (data), and we delete the line (~ ASCII).

Note that we remove the character (#) from the title bar.

The last step is to convert the data to a table and then write it as a csv file.

Full code:

 #remove all variables (cleanup) rm(list=ls(all=TRUE)) gc() MWD_filePath="MWD_file.las"; conn=file(MWD_filePath,open="r") Ascii_txt=readLines(conn); mwd_txt = 0; for (i in 1:length(Ascii_txt)){ if(Ascii_txt[i] == "~ASCII"){ mwd_txt <- Ascii_txt[(i-1):length(Ascii_txt)] # remove (#) from the header line substr(mwd_txt[1], 1, 2) <- " "; # remove "~ASCII" line mwd_txt <- mwd_txt[-2] break; } } close(conn) #mwd_txt; mwd <- read.table(header = TRUE, text=mwd_txt); #head(mwd) #write the mwd data to file ... in CSV format mwd_csv_file <- paste(MWD_filePath, ".csv", sep=""); write.csv(mwd, file = mwd_csv_file); 
+1
source

I have made for my personal (suitable for my purpose) use of the las2 log file reader. It consists of 2 stages 1. create a list of * .las files for reading and adding 2. read the number of * .las files and add data to one frame. Both codes are tested for a set of * .las files created from standard commercial packages in 2016 - in Windows 10 under R 3.2.4 (64bit)

Code-1 to read and create a simple list of * .las files to run 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 Reads many * .las files and creates a single data frame.

 # 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") 

Hope this is helpful !!

+1
source

All Articles