From e425ca365e2e107cb17840b87edbb969f6933283 Mon Sep 17 00:00:00 2001 From: hsonne Date: Fri, 2 Aug 2024 20:50:31 +0200 Subject: [PATCH] Convert types manually if read.table() failed --- R/extractObservationData_1.R | 50 ++++++++++++++++++++++++++++++++---- R/readEuCodedFile.R | 1 + 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/R/extractObservationData_1.R b/R/extractObservationData_1.R index 27a4bd2..1eec6f5 100644 --- a/R/extractObservationData_1.R +++ b/R/extractObservationData_1.R @@ -4,7 +4,6 @@ extractObservationData_1 <- function( ) { #kwb.utils::assignPackageObjects("kwb.en13508.2") - #header.info <- kwb.en13508.2::euCodedFileHeader() # Create accessor function to header info fields fromHeader <- kwb.utils::createAccessor(header.info) @@ -33,7 +32,7 @@ extractObservationData_1 <- function( colClasses = colClasses, header = TRUE ) - + indices$B01 <- indices$B[grep("^#B01=", eu_lines[indices$B])] # Try to generate a vector of inspection numbers assigning to each observation @@ -133,7 +132,7 @@ getColClasses2 <- function(codes, as.text) if (as.text) { colClasses[] <- "character" } - + colClasses } @@ -156,9 +155,9 @@ readObservationsFromCsvText <- function(text, sep, dec, quote, colClasses, ...) } dot.args <- list(...) - #dot.args <- list() # for debugging! + #dot.args <- list(header = TRUE) # for debugging! - kwb.utils::callWith( + result <- try(kwb.utils::callWith( utils::read.table, text = text, sep = sep, @@ -169,5 +168,46 @@ readObservationsFromCsvText <- function(text, sep, dec, quote, colClasses, ...) stringsAsFactors = FALSE, colClasses = colClasses, dot.args + )) + + if (!kwb.utils::isTryError(result)) { + return(result) + } + + result <- kwb.utils::callWith( + utils::read.table, + text = text, + sep = sep, + dec = dec, + quote = quote, + comment.char = "", + blank.lines.skip = FALSE, + stringsAsFactors = FALSE, + colClasses = NA, + dot.args + ) + + convertTypes(result, codes = inspectionDataFieldCodes()) +} + +# convertTypes ----------------------------------------------------------------- +convertTypes <- function(data, codes) +{ + target_classes <- sapply( + get_elements(codes, names(data)), get_elements, "class" ) + + given_classes <- sapply(data, "class") + + columns_convert <- names(which(given_classes != target_classes)) + + for (column in columns_convert) { + target_class <- target_classes[column] + data[[column]] <- kwb.utils::catAndRun( + sprintf("Converting column '%s' to %s", column, target_class), + do.call(paste0("as.", target_class), list(data[[column]])) + ) + } + + data } diff --git a/R/readEuCodedFile.R b/R/readEuCodedFile.R index fac1afb..3f79619 100644 --- a/R/readEuCodedFile.R +++ b/R/readEuCodedFile.R @@ -108,6 +108,7 @@ readEuCodedFile <- function( dot.args <- list(...) #dot.args <- list() # for debugging! + #dot.args <- list(as.text = TRUE) observations <- run( "Extracting observation records",