Hello,

OK, I had some spare time. Try



readCSVFile <- function(filename){
  lns <- readLines(filename)
  lns <- lns[sapply(lns, nchar) > 0]
  lns <- gsub(" ", "", lns)
  lns <- sub(";$", "", lns)
  i_title <- grep("[[:alpha:]]", lns)

  blocks <- lapply(seq_along(i_title)[-1], function(i){
    if(i == length(i_title)){
      j <- i_title[i] + 1
      k <- length(lns)
    }else{
      j <- i_title[i] + 1
      k <- i_title[i + 1] - 1
    }
    lns[j:k]
  })

  n <- length(unlist(strsplit(blocks[[1]][1], ";")))
  first <- unlist(strsplit(lns[i_title[1] + 1], ";"))
  first <- as.numeric(first)
  first <- rep(first, each = n)

  blocks <- lapply(blocks, function(x){
    unlist(strsplit(x, ";"))
  })
  res <- do.call(cbind.data.frame, blocks)
  res <- cbind.data.frame(first, res)

  names(res) <- sub("\\[.*\\]$", "", lns[i_title])
  res
}

df1 <- readCSVFile("strange.csv")


If this function doesn't do it, please try to make an effort on your own, R-Help is not a code writing service, it's a mail list for *doubts* on R code.

Hope this helps,

Rui Barradas

Às 09:18 de 07/10/19, vod...@zoho.com escreveu:
I am mad about importing this strange csv format type.

The real csv has been attached now. The raw data points are huge.

Many thanks.




  ---- 在 星期日, 06 十月 2019 07:58:37 -0700 Rui Barradas <ruipbarra...@sapo.pt> 撰写 
----
  > Hello,
  >
  > It is not clear if all files have
  >
  > * a first block with just one data line
  > * all other blocks with as many rows as the numbers in that first data line.
  >
  > If yes, maybe something like this?
  >
  > lns <- readLines("strange.csv")
  > lns <- lns[sapply(lns, nchar) > 0]
  > lns <- sub(",$", "", lns)
  > i_title <- grep("[[:alpha:]]", lns)
  >
  > tmp <- lapply(seq_along(i_title), function(i){
  >    tmp <- if(i < length(i_title)){
  >      lns[(i_title[i] + 1):(i_title[i + 1] - 1)]
  >    }else{
  >      lns[(i_title[i] + 1):length(lns)]
  >    }
  >    list(n = length(tmp), text = unlist(strsplit(tmp, ",")))
  > })
  >
  > n <- max(sapply(tmp, '[[', 'n'))
  > tmp <- lapply(tmp, function(x) as.numeric(x$text))
  > tmp[[1]] <- rep(tmp[[1]], each = n)
  > res <- do.call(cbind.data.frame, tmp)
  > names(res) <- lns[i_title]
  > res
  >
  >
  > If you have hundreds of files, you should make a function out of the
  > code above.
  >
  > Hope this helps,
  >
  > Rui Barradas
  >
  > Às 12:29 de 06/10/19, vod vos via R-help escreveu:
  > > I got hundreds of csv files. The real formats in each csv file are as 
follows:
  > >
  > > aa(cm)
  > > 1, 2 , 3,
  > >
  > > bb(mm)
  > > 1, 2, 3,
  > > 4, 5, 6,
  > > 7, 8, 9,
  > >
  > > cc(mm)
  > > 3, 4, 5,
  > > 7, 5, 9,
  > > 6, 5, 8,
  > >
  > > How can I use read.table or read.csv to convert the csv files
  > > to a tidy data frame format as follow:
  > >
  > > aa, bb, cc
  > > 1, 1, 3
  > > 1, 2, 4
  > > 1, 3, 5
  > > 2, 4, 7
  > > 2, 5, 5
  > > 2, 6, 9
  > > 3, 7, 6
  > > 3, 8, 5
  > > 3, 9, 8
  > >
  > > many thanks.
  > >
  > > ______________________________________________
  > > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
  > > https://stat.ethz.ch/mailman/listinfo/r-help
  > > PLEASE do read the posting guide 
http://www.R-project.org/posting-guide.html
  > > and provide commented, minimal, self-contained, reproducible code.
  > >
  >


______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to