split.muxd <- function(uxdfile, range.descriptor) { # Fix this some other day!! # Function that reads an UXD file which contains several ranges # (created in a programmed run, for example) and splits it into # its ranges and writes to that number of files # Arguments # :: uxdfile (filename with extension) # :: range.descriptor (an array with as many elements as # there are ranges in the uxdfile) # Returns: nothing. Writes files to HDD. cchar <- "[;_]" #regexpr matching the comment characters used in Bruker's UXD cdata <- "[0-9]" #regexpr matching one character of any digit # Create filenames for the output # no longer used, return dataframe instead datafile <- paste(uxdfile,"-",range.descriptor,".data",sep="") # Read the input multirange file f <- readLines(uxdfile, n=-1) # This way we identify data rows by looking for numeric characters. #wh <- regexpr("[0-9]", f) # This way we identify header rows # Later we will assume that all other rows are data wh <- regexpr(cchar, f) mh <- wh[1:length(wh)] # this gives you the corresponding index vector # the value of each element corresponds to the position of the regexp match. # value = 1 means the first character of the row is cchar (row is header) # value =-1 means no cchar occur on the row (row is data) #length(mh[mh == -1]) #total number of datarows in uxdfile #mh[mh > 1 | mh < 0] <- 0 #set all header-rows to zero (just to make things easier) i <- seq(1, length(mh) - 1, 1) j <- seq(2, length(mh), 1) starts <- which(mh[i] == 1 & mh[j] != 1) + 1 #start indices ends <- which(mh[i] != 1 & mh[j] == 1) #end indices, except the last ends <- c(ends, length(mh)) #fixed the last index of ends #ff <- data.frame(NULL) for (s in 1:length(range.descriptor)) { matrix(scan(file=textConnection(f[starts[s]:ends[s]]), what = numeric()), ncol=2, byrow=T) } names(ff) <- c("sampleid", "angle", "intensity") # Return dataframe ff }