熱線電話:13121318867

登錄
首頁精彩閱讀R語言︱文件讀入、讀出一些方法羅列(批量xlsx文件、數據庫、文本txt、文件夾)
R語言︱文件讀入、讀出一些方法羅列(批量xlsx文件、數據庫、文本txt、文件夾)
2017-04-23
收藏

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上查看代碼片派生到我的代碼片
    read.table(file, header = FALSE, sep = "", quote = "\"'",  
    dec = ".", skip = 0,  
    strip.white = FALSE, blank.lines.skip = TRUE,  
    comment.char = "#") 
其中:
file表示要讀取的文件,其中有一種神級讀入法(file.choose()):
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    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 = "\""來解決。
其中非結構化數據,在讀入的時候會出現很多分隔符的問題,
——————————————————————————————————————————————————————————————————
二、數據庫讀入——RODBC包
RODBC包中能夠基本應付數據庫讀入。一般數據數據庫讀入過程中主要有:
連接數據庫(odbcConnect)、讀入某張表(sqlFetch)、讀某表某指標(sqlQuery)、關閉連接(close)
還有一些功能:
把R數據讀入數據庫(sqlSave)、刪除數據庫某表(sqlDrop)
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    #安裝RODBC包  
    install.packages("RODBC")   
    library(RODBC)  
    mycon<-odbcConnect("mydsn",uid="user",pwd="rply")  
    #通過一個數據源名稱(mydsn)和用戶名(user)以及密碼(rply,如果沒有設置,可以直接忽略)打開了一個ODBC數據庫連接 
    data(USArrests)  
    #將R自帶的“USArrests”表寫進數據庫里  
    sqlSave(mycon,USArrests,rownames="state",addPK=TRUE)  
    #將數據流保存,這時打開SQL Server就可以看到新建的USArrests表了  
    rm(USArrests)  
    #清除USArrests變量 
    sqlFetch(mycon, "USArrests" ,rownames="state")  
    #輸出USArrests表中的內容  
    sqlQuery(mycon,"select * from USArrests")  
    #對USArrests表執行了SQL語句select,并將結果輸出 
    sqlDrop(channel,"USArrests")  
    #刪除USArrests表  
    close(mycon)  
    #關閉連接 
——————————————————————————————————————————————————————————————————
三、批量讀取——xlsx包
首先嘗試用R包解決。即xlsx包。
xlsx包在加載時容易遇到問題?;径际怯捎贘ava環境未配置好,或者環境變量引用失敗。因此要首先配置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)??赡苁荝在讀取路徑時,對x86這樣的文件夾不大好識別吧,我第一次裝在x86里,讀取是失敗的。
2、在R中加載環境,即一行代碼,路徑要依據你的java版本做出更改。
R
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、讀取xlsx中所有的sheet表格  
    #如果像vector一樣定義List??——list()函數來主動定義,用data.list[[i]]來賦值  
    data.list<-list()  
    for (i in 1:2){  
      data.list[[i]]=read.xlsx("C1.xlsx",i)  
    } 
批量寫出
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    #3、利用List批量讀出操作  
    #難點:如果構造輸出表格的名稱——paste來構造名稱  
    flie=list()  
    xlsxflie=paste(1:2,".xlsx",sep="") 
    for(i in 1:2){  
    flie[[i]]=paste("C:/Users/long/Desktop/",xlsxflie[i],sep="")  
    write.xlsx(data.list2[[i]],file)  
    } 
其中出現了一個小錯誤: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上查看代碼片派生到我的代碼片
    #lapply讀取法  
    filenames <- list.files("C:/Users/a.csv", pattern = ".csv",full.names = TRUE)  #變成list格式  
    #沒有full.names = TRUE,都會出現cannot open file: No such file or directory  
      
    name=function(x) {  
      read.csv(x,header=T)  
      }  
    datalist <- lapply(filenames,name)  #filenames執行name函數  
———————————————————————————————————————————————————————————————
五、批量讀入文件夾中的指定文件(如*.xlsx)
代碼思路:先遍歷文件夾(list.files),然后通過循環依次讀寫(read.xlsx)。
為什么lsit.files不能直接把完整數據讀入文件?——需要read.xlsx這一步驟
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    ##批量讀入文件夾中的xlsx文件  
    #如何批量讀取一個文件夾中的各種txt文件  
    micepath <- "C:/Users/long/Desktop"  
    micefiles <- list.files(micepath, pattern = "*.xlsx$", full.names = TRUE)  
      
    ##文件信息放入list中  
    files=list()  
    for (i in 1:2){  
      files[i]=read.xlsx(micefiles[[i]],header = F,1)  
    } 
——————————————————————————————————————————————————————————————————
五、批量讀入文件夾中的文本文件(*.txt),并生成名稱、文檔數據框
——用在情感分析中情感詞的打分數
代碼思路:先遍歷文件夾中所有txt(list.files)、構造文本讀入函數(read.txt)、找文本名字(list.files)、然后生成數據框(as.data.frame)
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片

    ##批量讀入txt文件,并將文本放入同一個數據框  
    reviewpath <- "F:/R語言/R語言文本挖掘/情感分析/數據/rawdata/review_sentiment/train2"  
    completepath <- list.files(reviewpath, pattern = "*.txt$", full.names = TRUE)  
      
    ######批量讀入文本  
    read.txt <- function(x) {  
      des <- readLines(x)                   #每行讀取  
      return(paste(des, collapse = ""))     #沒有return則返回最后一個函數對象  
    }  
    review <- lapply(completepath, read.txt)  
    #如果程序警告,這里可能是部分文件最后一行沒有換行導致,不用擔心。  
      
    ######list轉數據框  
    docname <- list.files(reviewpath, pattern = "*.txt$")  
    reviewdf <- as.data.frame(cbind(docname, unlist(review)),   
                              stringsAsFactors = F)  
其中,list.files()中,full.names=T代表讀入文件+信息,full.names=F代表讀入文件名字。
本代碼來源于書《數據挖掘之道》情感分析章節。
——————————————————————————————————————————————————————————————————
六、excel的xlsx格式讀取——openxlsx包
跟xlsx包可以一拼,為什么沒有特別好的excel包,因為微軟的軟件不開源,而且內嵌設置時長變化,所以么有一款統一的好函數包,來進行讀取。
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片

    library(openxlsx)  
    data=read.xlsx("hsb2.xlsx",sheet=1) 
——————————————————————————————————————————————————————————————————
七、write.table讀出txt文本
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    write.table(data,"names",  
                quote = F,row.names = FALSE, col.names = FALSE) 
輸出的結果可能是像excel列表一樣:
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    id   names  
    1      “您好”  
    2      “格式”  
    3      “讀取” 
所以需要去掉行、列名,同時去掉雙引號。
如果我想得到,這樣格式的呢:
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    您好 格式 讀取 
需要調整ecol,默認的ecol="\n",就是回車,所以會造成換行,所以需要換成“\r”,同時中間需要有空格分開,所以最終ecol="\r\ "用【\+空格】來表達空格

———————————————————————————————————————————————————————————————————
八 文件夾讀入
文件夾讀入的方式也挺多的。
第一步:獲取文件夾內全文件內容
兩種函數:dir()以及list.files()
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    dir('C:\\Users\\long\\Desktop\\',pattern = "txt$")  
    ist.files('C:\\Users\\long\\Desktop\\',pattern = "txt$") 
同時,可以通過pattren來選擇規定格式的文件內容。
第二步:生成系統路徑
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片

    > paste("C:\\Users\\long\\Desktop\\","txt")  
    [1] "C:\\Users\\long\\Desktop\\ txt"  
    > file.path("C:\\Users\\long\\Desktop","txt")  
    [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上查看代碼片派生到我的代碼片
    Error: OutOfMemoryError (Java): Java heap space 
因為從錯誤信息來看,是因為你使用的報表占用太多內存(不夠或者沒有釋放),而導致堆內存溢出。
解決方案從兩個方面著手,1、加大內存如-Xmx1024m;2、檢查優化代碼及時釋放內存
————————————————————————————————————————————
應用四:用R語言來移動圖片文件——file.copy
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    for (i in 1:length(selectname)){  
      originpath = paste(origin_source,selectname[i],sep = '')  
      savepath = paste(save_path,selectname[i],sep = '')  
      file.copy(originpath, save_path)  
    } 
可以看到file.copy是主要用來做移動的函數,originpath是路徑名(細致到文件名稱以及后綴),savepath可以是文件夾名稱。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢