2012-09-27 13 views
25

द्वारा आर लाइन में एक टेक्स्ट फ़ाइल पढ़ने के लिए मैं लूप के लिए और फ़ाइल की लंबाई के साथ, लाइन में लाइन, लाइन द्वारा एक टेक्स्ट फ़ाइल पढ़ना चाहूंगा। समस्या यह है कि यह केवल चरित्र (0) प्रिंट करता है।लाइन

fileName="up_down.txt" 
con=file(fileName,open="r") 
line=readLines(con) 
long=length(line) 
for (i in 1:long){ 
    linn=readLines(con,1) 
    print(linn) 
} 
close(con) 
+8

समस्या यह है कि आप पूरी फ़ाइल को ''line = readLines (con)' में पढ़ते हैं) और फिर आप लूप के अंदर फ़ाइल को पढ़ना जारी रखते हैं; बिंदु पर, पढ़ने के लिए कुछ भी नहीं बचा है। –

+0

यदि आप [वर्तमान में स्वीकृत उत्तर] (http://stackoverflow.com/a/12627356/1067114) की तुलना में एक (शायद बड़ी) फ़ाइल से एक समय में केवल एक पंक्ति लोड करने का तरीका ढूंढ रहे हैं, तो यह आपके समाधान को हल नहीं कर रहा है मुसीबत। यदि, इसके बजाय, आप फ़ाइल लाइन की सामग्री को लाइन से संसाधित करना चाहते हैं, भले ही आप इसे कैसे लोड करते हैं, शायद सवाल बेहतर तैयार किया जाना चाहिए। –

उत्तर

25

यहाँ एक for पाश के साथ समाधान है। महत्वपूर्ण बात यह है कि लूप के बाहर readLines पर एक कॉल लेता है ताकि इसे अनुचित रूप से बार-बार बुलाया न जाए। यहां यह है:

fileName <- "up_down.txt" 
conn <- file(fileName,open="r") 
linn <-readLines(conn) 
for (i in 1:length(linn)){ 
    print(linn[i]) 
} 
close(conn) 
+2

जब आप पूरे वेक्टर को प्रिंट कर रहे हैं तो आपको लूप की आवश्यकता नहीं है। बस 'प्रिंट (लिन) 'पर्याप्तताएं। –

+1

बहुत अच्छा जवाब। आर "<-" में आम तौर पर "=" – Ryan

+2

के बजाय सम्मेलन में उपयोग किया जाता है यदि आपके पास 30 गीगा फ़ाइल है तो क्या होगा? – Chris

31

बस अपनी फ़ाइल पर readLines का उपयोग करें:: इस कोड है

R> res <- readLines(system.file("DESCRIPTION", package="MASS")) 
R> length(res) 
[1] 27 
R> res 
[1] "Package: MASS"                 
[2] "Priority: recommended"               
[3] "Version: 7.3-18"                 
[4] "Date: 2012-05-28"                
[5] "Revision: $Rev: 3167 $"               
[6] "Depends: R (>= 2.14.0), grDevices, graphics, stats, utils"      
[7] "Suggests: lattice, nlme, nnet, survival"           
[8] "[email protected]: c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\")," 
[9] "  email = \"[email protected]\"), person(\"Kurt\", \"Hornik\", role" 
[10] "  = \"trl\", comment = \"partial port ca 1998\"), person(\"Albrecht\"," 
[11] "  \"Gebhardt\", role = \"trl\", comment = \"partial port ca 1998\"),"  
[12] "  person(\"David\", \"Firth\", role = \"ctb\"))"       
[13] "Description: Functions and datasets to support Venables and Ripley,"    
[14] "  'Modern Applied Statistics with S' (4th edition, 2002)."     
[15] "Title: Support Functions and Datasets for Venables and Ripley's MASS"   
[16] "License: GPL-2 | GPL-3"               
[17] "URL: http://www.stats.ox.ac.uk/pub/MASS4/"          
[18] "LazyData: yes"                 
[19] "Packaged: 2012-05-28 08:47:38 UTC; ripley"          
[20] "Author: Brian Ripley [aut, cre, cph], Kurt Hornik [trl] (partial port"   
[21] "  ca 1998), Albrecht Gebhardt [trl] (partial port ca 1998), David"   
[22] "  Firth [ctb]"                
[23] "Maintainer: Brian Ripley <[email protected]>"        
[24] "Repository: CRAN"                
[25] "Date/Publication: 2012-05-28 08:53:03"           
[26] "Built: R 2.15.1; x86_64-pc-mingw32; 2012-06-22 14:16:09 UTC; windows"   
[27] "Archs: i386, x64"                
R> 

एक पूरे इस के लिए समर्पित पुस्तिका नहीं है ...

+0

मैं रीडलाइन का उपयोग कर रहा हूं, लेकिन मुझे नहीं लगता कि मुझे यह त्रुटि क्यों मिली है – Layla

+0

जब आप कहते हैं कि इसमें एक संपूर्ण मैनुअल समर्पित है, तो आपको यह भी बताएं कि यह कौन सा मैनुअल है। –

57

आपको readLines(...) और बड़ी फ़ाइलों का ध्यान रखना चाहिए। स्मृति में सभी लाइनों को पढ़ना खतरनाक हो सकता है। नीचे दिए गए समय में फाइल और सिर्फ एक लाइन प्रक्रिया को पढ़ने के लिए की एक उदाहरण है:

processFile = function(filepath) { 
    con = file(filepath, "r") 
    while (TRUE) { 
    line = readLines(con, n = 1) 
    if (length(line) == 0) { 
     break 
    } 
    print(line) 
    } 

    close(con) 
} 

भी स्मृति में एक पंक्ति को पढ़ने के जोखिम को समझें। लाइन ब्रेक के बिना बड़ी फाइलें भी आपकी याददाश्त भर सकती हैं।

+3

यह वास्तव में स्वीकार्य उत्तर होना चाहिए, क्योंकि अन्य बड़ी फ़ाइलों के साथ मुद्दों में भाग लेंगे। – theduke

+0

यह लाइन द्वारा बड़ी फ़ाइल लाइन को पार्स करने का सही तरीका है। अन्य उत्तरों स्मृति में सभी पंक्तियों में पढ़ते हैं, और फिर लूप जो स्मृति में ऑब्जेक्ट करता है, जो इससे बिल्कुल अलग है। –

1

मैं अपनी मांग को पूरा करने के लिए लाइन लाइन को पढ़ने के लिए एक कोड लिखता हूं, जिसमें अलग-अलग पंक्ति के अलग-अलग डेटा प्रकार हैं लेखों का पालन करें: read-line-by-line-of-a-file-in-r और determining-number-of-linesrecords। और मुझे लगता है कि बड़ी फाइल के लिए यह एक बेहतर समाधान होना चाहिए। मेरा आर संस्करण (3.3.2)।

con = file("pathtotargetfile", "r") 
readsizeof<-2 # read size for one step to caculate number of lines in file 
nooflines<-0  # number of lines 
while((linesread<-length(readLines(con,readsizeof)))>0) # calculate number of lines. Also a better solution for big file 
    nooflines<-nooflines+linesread 

con = file("pathtotargetfile", "r") # open file again to variable con, since the cursor have went to the end of the file after caculating number of lines 
typelist = list(0,'c',0,'c',0,0,'c',0) # a list to specific the lines data type, which means the first line has same type with 0 (e.g. numeric)and second line has same type with 'c' (e.g. character). This meet my demand. 
for(i in 1:nooflines) { 
    tmp <- scan(file=con, nlines=1, what=typelist[[i]], quiet=TRUE) 
    print(is.vector(tmp)) 
    print(tmp) 
} 
close(con)