I need to automate R to read a csv datafile that's into a zip file.
For example, I would type:
read.zip(file = "myfile.zip")
And internally, what would be done is:
myfile.zip
to a temporary folderread.csv
If there is more than one file into the zip file, an error is thrown.
My problem is to get the name of the file contained into the zip file, in orded to provide it do the read.csv
command. Does anyone know how to do it?
UPDATE
Here's the function I wrote based on @Paul answer:
read.zip <- function(zipfile, row.names=NULL, dec=".") { # Create a name for the dir where we'll unzip zipdir <- tempfile() # Create the dir using that name dir.create(zipdir) # Unzip the file into the dir unzip(zipfile, exdir=zipdir) # Get the files into the dir files <- list.files(zipdir) # Throw an error if there's more than one if(length(files)>1) stop("More than one data file inside zip") # Get the full name of the file file <- paste(zipdir, files[1], sep="/") # Read the file read.csv(file, row.names, dec) }
Since I'll be working with more files inside the tempdir()
, I created a new dir inside it, so I don't get confused with the files. I hope it may be useful!
Read Zipped Files into R In the age of big data, it’s not uncommon to encounter a large zipped file of multiple text files. Unzipping will take time. It turns out we can read them into R without unzipping first.
So those files can be stored in various formats. It may be stored in .txt (tab-separated value) file, or in a tabular format i.e .csv (comma-separated value) file or it may be on internet or cloud. R provides very easier methods to read those files. One of the important formats to store a file is in a text file.
How to Use zip (), unzip () and tar (), untar () Functions in R. 1 To zip file, use zip (). 2 To unzip the file, use unzip (). 3 To tar the file, use tar (). 4 To untar the file, use untar ().
read.delim (): This method is used for reading “tab-separated value” files (“.txt”). By default, point (“.”) is used as decimal points. read.delim (file, header = TRUE, sep = “t”, dec = “.”, …) file: the path to the file containing the data to be read into R.
Another solution using unz
:
read.zip <- function(file, ...) { zipFileInfo <- unzip(file, list=TRUE) if(nrow(zipFileInfo) > 1) stop("More than one data file inside zip") else read.csv(unz(file, as.character(zipFileInfo$Name)), ...) }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With