R語言︱文件讀入、讀出一些方法羅列(批量xlsx文件、數據庫、文本txt、文件夾)


筆者寄語:小規模的讀取數據的方法較為簡單並且多樣,但是,批量讀取目前看到有以下幾種方法:xlsx包、RODBC包、批量轉化成csv后讀入。

R語言中還有一些其他較為普遍的讀入,比如代碼包,R文件,工作空間等。

source  #讀取R代碼
dget    #讀取R文件
load    #讀取工作空間

 

————————————————————————————————

SPSS-STATA格式的讀入包——foreign

 

讀取其他軟件的格式foreign
install.packages("foreign")
#讀取SPSS stata sas
spss<-read.spss("hsb2.sav",to.data.frame=T)
stata<-read.dta("hsb2.dta")

————————————————————————————————

 

一、小規模數據——簡單讀入方式

read.table、write.table 、read.csv 、write.csv、readLine(字符型格式常用)。

常見格式:

 

[plain]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. read.table(file, header = FALSE, sep = "", quote = "\"'",  
  2. dec = ".", skip = 0,  
  3. strip.white = FALSE, blank.lines.skip = TRUE,  
  4. comment.char = "#")  
其中:
file表示要讀取的文件,其中有一種 神級讀入法(file.choose())
[plain]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. read.table(file.choose())  
header來確定數據文件中第一行是不是標題;
sep指定分隔符,默認是空格;
quote是引號,默認就是雙引號;
dec是小數點的表示,默認就是一個點;
skip是確定是否跳過某些行;
strip.white確定是否消除空白字符;
blank.lines.skip確定是否跳過空白行;
comment.char指定用於表示注釋的引導符號。
 

 

在使用read.table、read.csv讀取字符數據時,會發生很多問題:

1、問題一:Warning message:EOF within quoted string;     需要設置quote,read.csv("/..csv",quote = "");

2、問題二:出現所有的數據被加入了雙引號,比如“你好”,“睡覺”;                               

     解決方案:先as.character(x[1:5]),可以發現比如”\”你好\”“,這樣的格式,就可以用sep = "\""來解決。

 

其中非結構化數據,在讀入的時候會出現很多分隔符的問題

可以見博客:【R】數據導入讀取read.table函數詳解,如何讀取不規則的數據(fill=T)

 

——————————————————————————————————————————————————————————————————

 

二、數據庫讀入——RODBC包

RODBC包中能夠基本應付數據庫讀入。一般數據數據庫讀入過程中主要有:

連接數據庫(odbcConnect)、讀入某張表(sqlFetch)、讀某表某指標(sqlQuery)、關閉連接(close)

還有一些功能:

把R數據讀入數據庫(sqlSave)、刪除數據庫某表(sqlDrop)

 

[plain]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. #安裝RODBC包  
  2. install.packages("RODBC")   
  3. library(RODBC)  
  4. mycon<-odbcConnect("mydsn",uid="user",pwd="rply")  
  5. #通過一個數據源名稱(mydsn)和用戶名(user)以及密碼(rply,如果沒有設置,可以直接忽略)打開了一個ODBC數據庫連接  
  6.   
  7. data(USArrests)  
  8. #將R自帶的“USArrests”表寫進數據庫里  
  9. sqlSave(mycon,USArrests,rownames="state",addPK=TRUE)  
  10. #將數據流保存,這時打開SQL Server就可以看到新建的USArrests表了  
  11. rm(USArrests)  
  12. #清除USArrests變量  
  13.   
  14. sqlFetch(mycon, "USArrests" ,rownames="state")  
  15. #輸出USArrests表中的內容  
  16. sqlQuery(mycon,"select * from USArrests")  
  17. #對USArrests表執行了SQL語句select,並將結果輸出  
  18.   
  19. sqlDrop(channel,"USArrests")  
  20. #刪除USArrests表  
  21. close(mycon)  
  22. #關閉連接  


——————————————————————————————————————————————————————————————————

 

三、批量讀取——xlsx包

 

首先嘗試用R包解決。即xlsx包。

xlsx包在加載時容易遇到問題。基本都是由於Java環境未配置好,或者環境變量引用失敗。因此要首先配置java環境,加載rJava包。

 

百度了一下,網上已有很多解決方案。我主要是參考這個帖子,操作步驟為:

 

1、 安裝最新版本的java。如果你用的R是64位的,請下載64位java。
下載地址: http://www.java.com/en/download/manual.jsp 


要安裝在 C:\Program Files\Java 下面,win8的尤其小心不要安裝為C:\Program Files(x86)。可能是R在讀取路徑時,對x86這樣的文件夾不大好識別吧,我第一次裝在x86里,讀取是失敗的。

 

2、在R中加載環境,即一行代碼,路徑要依據你的java版本做出更改。

Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jre1.8.0_45\\') 

之后再加載rjava包或者xlsx包就成功了。

 

xlsx包加載成功后,用read.xlsx就可以直接讀取xlsx文件,還可以指定讀取的行和段,以及第幾個表,以及可以保存為xlsx文件,這個包還是很強大的。

 

但是這個方法存在兩個問題:

 

1、不是所有的公司電腦都能自由的配置java環境。很多人的權限是受限的。而且有些公司內部應用是在java環境下配置的。就算你找了IT去安裝java,但是一些內部應用可能會因為版本號兼容問題而出錯,得小失大。

2、用xlsx包讀取數據,在數據量比較小的時候速度還是比較快的。但是如果xlsx本身比較大,包含數據多,read.xlsx效率會很低,不如data.table包的fread讀取快捷以及省內存。但fread函數不支持xlsx的讀入。。。

(參見這篇帖子,里面對千萬行數據,fread也只用了10秒左右,比常規的read.table或者read.csv至少省時一倍)

 

綜上,由於java環境的復雜性與兼容度,還有xlsx包本身讀取速度的限制,用xlsx包讀取xlsx包的方法,更適合於: 


1、個人電腦,自己想怎么玩都無所謂,或者高大上的Linux, mac環境 


2、數據量不會特別大,而且excel文件很干凈,需要細節的操作

 

實際操作案例:

批量寫入

 

[plain]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. #1、讀取xlsx中所有的sheet表格  
  2. #如果像vector一樣定義List??——list()函數來主動定義,用data.list[[i]]來賦值  
  3. data.list<-list()  
  4. for (i in 1:2){  
  5.   data.list[[i]]=read.xlsx("C1.xlsx",i)  
  6. }  

批量寫出

[plain]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. #3、利用List批量讀出操作  
  2. #難點:如果構造輸出表格的名稱——paste來構造名稱  
  3. flie=list()  
  4. xlsxflie=paste(1:2,".xlsx",sep="")  
  5.   
  6. for(i in 1:2){  
  7. flie[[i]]=paste("C:/Users/long/Desktop/",xlsxflie[i],sep="")  
  8. write.xlsx(data.list2[[i]],file)  
  9. }  

 

其中出現了一個小錯誤:Error in file[[i]] : object of type 'closure' is not subsettable

這一錯誤是因為我寫錯函數名字了... file->flie(詳情見:http://bbs.pinggu.org/thread-3142627-1-1.html)

 

主要運用了list函數,詳情可見:R語言︱list用法、批量讀取、寫出數據時的用法

 

 

——————————————————————————————————————————————————————————————————

四、批量讀入XLSX文件——先轉換為CSV后讀入

 

CSV讀入的速度較快,筆者這邊整理的是一種EXCEL VBA把xlsx先轉換為csv,然后利用read.csv導入的辦法。

WPS中調用VBA需要額外下砸一個插件,

之后應用list.files以List方式讀入。

 

[plain]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. #lapply讀取法  
  2. filenames <- list.files("C:/Users/a.csv", pattern = ".csv",full.names = TRUE)  #變成list格式  
  3. #沒有full.names = TRUE,都會出現cannot open file: No such file or directory  
  4.   
  5. name=function(x) {  
  6.   read.csv(x,header=T)  
  7.   }  
  8. datalist <- lapply(filenames,name)  #filenames執行name函數  


——————————————————————————————————————————————————————————————————

 

 

五、批量讀入文件夾中的指定文件(如*.xlsx)

代碼思路:先遍歷文件夾(list.files),然后通過循環依次讀寫(read.xlsx)。

 

為什么lsit.files不能直接把完整數據讀入文件?——需要read.xlsx這一步驟

 

 

[plain]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. ##批量讀入文件夾中的xlsx文件  
  2. #如何批量讀取一個文件夾中的各種txt文件  
  3. micepath <- "C:/Users/long/Desktop"  
  4. micefiles <- list.files(micepath, pattern = "*.xlsx$", full.names = TRUE)  
  5.   
  6. ##文件信息放入list中  
  7. files=list()  
  8. for (i in 1:2){  
  9.   files[i]=read.xlsx(micefiles[[i]],header = F,1)  
  10. }  



 

——————————————————————————————————————————————————————————————————

 

 

五、批量讀入文件夾中的文本文件(*.txt),並生成名稱、文檔數據框

——用在情感分析中情感詞的打分數

 

 

代碼思路:先遍歷文件夾中所有txt(list.files)、構造文本讀入函數(read.txt)、找文本名字(list.files)、然后生成數據框(as.data.frame)

 

[plain]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. ##批量讀入txt文件,並將文本放入同一個數據框  
  2. reviewpath <- "F:/R語言/R語言與文本挖掘/情感分析/數據/rawdata/review_sentiment/train2"  
  3. completepath <- list.files(reviewpath, pattern = "*.txt$", full.names = TRUE)  
  4.   
  5. ######批量讀入文本  
  6. read.txt <- function(x) {  
  7.   des <- readLines(x)                   #每行讀取  
  8.   return(paste(des, collapse = ""))     #沒有return則返回最后一個函數對象  
  9. }  
  10. review <- lapply(completepath, read.txt)  
  11. #如果程序警告,這里可能是部分文件最后一行沒有換行導致,不用擔心。  
  12.   
  13. ######list轉數據框  
  14. docname <- list.files(reviewpath, pattern = "*.txt$")  
  15. reviewdf <- as.data.frame(cbind(docname, unlist(review)),   
  16.                           stringsAsFactors = F)   

 

其中,list.files()中,full.names=T代表讀入文件+信息,full.names=F代表讀入文件名字。

本代碼來源於書《數據挖掘之道》情感分析章節。

 

 

——————————————————————————————————————————————————————————————————

 

六、excel的xlsx格式讀取——openxlsx包

 

跟xlsx包可以一拼,為什么沒有特別好的excel包,因為微軟的軟件不開源,而且內嵌設置時長變化,所以么有一款統一的好函數包,來進行讀取。

 

[html]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. library(openxlsx)  
  2. data=read.xlsx("hsb2.xlsx",sheet=1)  



 

——————————————————————————————————————————————————————————————————

 

七、write.table讀出txt文本

 

[html]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. write.table(data,"names",  
  2.             quote = F,row.names = FALSE, col.names = FALSE)  

輸出的結果可能是像excel列表一樣:

 

 

[html]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. id   names  
  2. 1      “您好”  
  3. 2      “格式”  
  4. 3      “讀取”  

所以需要去掉行、列名,同時去掉雙引號。

 

如果我想得到,這樣格式的呢:

 

[html]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. 您好 格式 讀取  


需要調整ecol,默認的ecol="\n",就是回車,所以會造成換行,所以需要換成“\r”,同時中間需要有空格分開,所以最終ecol="\r\ "用【\+空格】來表達空格

 

 

——————————————————————————————————————————————————————————————————————

八 文件夾讀入

文件夾讀入的方式也挺多的。

第一步:獲取文件夾內全文件內容

兩種函數:dir()以及list.files()

 

[html]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. dir('C:\\Users\\long\\Desktop\\',pattern = "txt$")  
  2. ist.files('C:\\Users\\long\\Desktop\\',pattern = "txt$")  

同時,可以通過pattren來選擇規定格式的文件內容。

 

第二步:生成系統路徑

 

[html]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. > paste("C:\\Users\\long\\Desktop\\","txt")  
  2. [1] "C:\\Users\\long\\Desktop\\ txt"  
  3. > file.path("C:\\Users\\long\\Desktop","txt")  
  4. [1] "C:\\Users\\long\\Desktop/txt"  


對比兩者,一般用paste來生成系統路徑的時候,在最終結果,結合的地方會多一個空格,當然也可以用去空格的方式排除,但是不夠好。

 

所以可以用file.path的方式直接生成,比較方便,而且絕對正確。

 

————————————————————————————————

應用一:R語言中大樣本讀出並生成txt文件

 

筆者進過分詞處理之后的文本詞量有3億+個詞,一下子導出成txt馬上電腦就死機,報錯內存不足的問題。

於是在找各種辦法解決如何生成一整個TXT文件。於是就有以下比較簡單的辦法,可以直接實現。

步驟一:先把分詞內容拆分成幾個部分,輸出成多個txt文件;

步驟二:用windows自帶的CMD里面的指令,來生成特定的TXT文件。

詳情可見(參考與百度知道):

 

1、使用組合鍵“Win + R”打開運行窗口,輸入“cmd”命令,進入命令行窗口。

2、在命令行窗口,進入需要合並的Txt文件的目錄,如下圖所示已進行“F:\stock”目錄。

3、確認目錄正確后,輸入“type *.txt >>f:\111.txt”,該命令將把當前目錄下的所有txt文件的內容輸出到f:\111.txt。

4、到此,打開合並后的f:\111.txt,即可看到多個Txt文件都已按順序合並到F盤的111.txt文件中。

 

————————————————————————————————————————————

     應用二:R語言中,用write.csv時候,用office打開,多出了很多行?

 

 

      如果文本字符長度很大,那么就會出現內容串到下面一行的情況,譬如10行的內容,可能變成了15行。好像office默認單個單元格的字符一般不超過2500字符,超過就會給到下一行。

      所以筆者在導入5W條數據時候,多出了很多行,於是只能手動刪除。

      如果用txt格式導出,用Notepad++打開是好的,但是用excel打開又多出來不少行,所以用excel打開是用代價的。

      但是由於excel是最好的導入SQL的格式,於是不得不手工刪除,同時犧牲一部分的內容。

 

————————————————————————————————————————————

 

應用三:R語言中,用tcltk讀入時候,報錯?

 

[html]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. Error: OutOfMemoryError (Java): Java heap space  

因為從錯誤信息來看,是因為你使用的報表占用太多內存(不夠或者沒有釋放),而導致堆內存溢出。
解決方案從兩個方面着手,1、加大內存如-Xmx1024m;2、檢查優化代碼及時釋放內存


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM