R/readBank.R

#' Functions to load data from banks
#'
#' @details This functions are adjusted \code{\link[utils]{read.table}} function
#' to load specific CSV files generated by various banks. Banks currently supported:
#' \itemize{
#' \item{mBank}{\code{mbank}}
#' \item{Idea Bank}{\code{idea}}
#' }
#'
#' @param file path to file with transaction data
#' @param bank character with bank name, see Details for supported banks
#' @param ... optional arguments passed to \code{\link[utils]{read.table}}
#'
#' @author Daniel Rodak
#' @importFrom utils maintainer
#' @export
readBank <- function(file, bank, ...) {
  if(!(bank %in% CNSTsupportedBanks)) {
    stop(bank, " is not supported. Contact with ", maintainer("budgetr"))
  }
  read.fun <- switch(
    bank,
    mbank = readMbank,
    idea = readIdea)
  return(read.fun(file, ...))
}

#' @importFrom utils read.table
readMbank <- function(file, ...) {
  callArgs <- as.list(match.call())
  if (is.null(callArgs$encoding)) {
    if (.Platform$OS.type == 'unix')
      enc <- 'latin1'
    else
      enc <- 'unknown'
  } else {
    enc <- callArgs$encoding
  }
  tbl <- read.table(file, header = TRUE, sep = ";", dec = ",",
                    quote = "\"", fill = TRUE, comment.char = "",
                    skip = 37, stringsAsFactors = FALSE,
                    encoding = enc, ...)
  tbl <- tbl[1:(nrow(tbl) - 2), c(2, 3, 4, 5, 7)]
  colnames(tbl) <- c("Date", "Type", "Title", "Payee", "Amount")
  cardTr <- grepl("DATA TRANSAKCJI: ", tbl$Title)
  cardDateStart <- vapply(
    gregexpr("DATA TRANSAKCJI: ", tbl$Title),
    function(x) {attr(x, "match.length") + x[1]},
    numeric(1L)
  )
  cardDate <- vapply(
    seq_along(tbl$Title),
    function(x) {
      if (cardTr[x]) {
        ret <- substr(tbl$Title[x], cardDateStart[x], 1000)
      } else {
        ret <- ""
      }
      ret
    },
    character(1L)
  )
  tbl$Date <- as.Date(ifelse(cardTr, cardDate, tbl$Date))
  tbl$Amount <- as.numeric(gsub(",", ".", gsub(" ", "", tbl$Amount)))
  tbl$Category <- rep("", nrow(tbl))
  return(tbl)
}

#' @importFrom utils read.table
readIdea <- function(file, ...) {
  tbl <- read.table(file, header = TRUE, sep = ";", dec = ",",
                    quote = "\"", fill = TRUE, comment.char = "",
                    skip = 1, stringsAsFactors = FALSE, ...)
  if (Sys.info()['sysname'] == 'Windows') {
    tbl <- tbl[, c(2, 16, 15, 10, 5)]
  } else {
    tbl <- tbl[, c(2, 24, 22, 17, 10)]
  }
  colnames(tbl) <- c("Date", "Type", "Title", "Payee", "Amount")
  tbl$Date <- as.Date(as.character(tbl$Date), "%Y%m%d")
  tbl$Amount <- ifelse(tbl$Type == 'uznanie', 1, -1) * tbl$Amount
  tbl$Category <- rep("", nrow(tbl))
  return(tbl)
}
daniel-rodak/budgetr documentation built on May 25, 2019, 4:22 p.m.