/ / R में डेटा फ़ाइल की कुछ पंक्तियों को कैसे पढ़ें - r, लाइन

R - r, लाइन में डेटा फ़ाइल की कुछ पंक्तियों को कैसे पढ़ें

मेरे पास एक बड़ी डेटा फ़ाइल है जिसमें 40,000+ लाइनें हैं। यह लॉग इनपुट की एक सूची है, और इस तरह थोड़ा सा दिखता है:

    D 20160602 14:15:43.559 F7982D62 Req Agr:131 Mra:0 Exp:0 Mxr:0 Mnr:0 Mxd:0 Mnd:0 Nro:0
D 20160602 14:15:43.559 F7982D62 Set Agr:130 Mra:0 Exp:0 Mxr:0 Mnr:0 Mxd:0 Mnd:0 Nro:0 I 20160602 14:15:43.559 F7982D62 GET 156.145.15.85:36773 xqixh8sl AES "/pcgc/public/Other/exome/fastq/PCGC0065109_HS_EX__1-04692__v3_FCAD2HMUACXX_L4_p1of1_P2.fastq.gz" ""
M 20160602 14:15:43.595 DOC1: F7982D62 Request for unencrypted meta data on encrypted transaction
M 20160602 14:15:48.353 DOC1: F7982D62 Transaction has been acknowledged at 722875647
F 20160602 14:15:48.398 F7982D62 GET 156.145.15.85:36773 xqixh8sl AES "/pcgc/public/Other/exome/fastq/PCGC0065109_HS_EX__1-04692__v3_FCAD2HMUACXX_L4_p1of1_P2.fastq.gz" "" 50725464 (4,32) "Remote Application: Session Aborted: Aborted by user interrupt"
M 20160602 14:15:48.780 DOC1: F7982D63 New download request D 20160602 14:15:48.780 F7982D63 META: 134 Path: /pcgc/public/CTD/exome/fastq/PCGC0033175_HS_EX__1-00304-01__v1_FCBC0RE4ACXX_L3_p32of96_P2.fastq.gz user: xqixh8sl pack: arg: feat: cE,s

चूंकि यह इतना बड़ा है, इसलिए मैं पूरी बात को याद में पढ़ना नहीं चाहता। मुझे केवल उन पंक्तियों की आवश्यकता है जो रेखा पहचानकर्ता "F" से शुरू होती हैं और इसमें एक (0, 0) त्रुटि होती है, जैसे:

    F 20160602 14:25:11.321 F7982D50 GET 156.145.15.85:37525 xqixh8sl AES "/pcgc/public/Other/exome/fastq/PCGC0077248_HS_EX__1-06808__v3_FCC49HJACXX_L7_p1of1_P1.fastq.gz" "" 3322771022 (0,0) "1499.61 seconds (17.7 megabits/sec)"

बाकी सब मैं सिर्फ अनदेखा कर सकता हूं। मेरा मुद्दा यह है: मैं इस फाइल लाइन को लाइन से पढ़ने का एक तरीका चाहता हूं और मूल्यांकन करता हूं कि आयात के लिए लाइन रखने की जरूरत है या नहीं। वर्तमान में, मैं एक का उपयोग कर रहा हूँ for पाश प्रत्येक पंक्ति के माध्यम से चलाने के लिए और का उपयोग कर रहा हूँ readLines() समारोह। यह कुछ इस तरह दिखता है:

library(stringr)
con <- file("dataSet.txt", open = "r")
Fdata <- data.frame
i <- 1
j <- 1
lineLength <- length(readLines(con))
for (i in 1:lineLength){
line <- readLines("dataSet.txt", 1)
if (str_sub(line, 1, 1) == "F" && grepl("\(0\,0\)", line)[i]){
print(line)
Fdata[j,] <- rbind(line)
i <- i + 1
j <- j + 1
}
i <- i + 1
}
print(Fdata)

यह ठीक चलता है, लेकिन यह जो आउटपुट देता है वह वह नहीं है जो मैं चाहता हूं। यह सिर्फ फाइल की पहली लाइन को बार-बार प्रिंट करता रहता है।

    [1] "C 20160525 05:27:47.915 Rotated log file: /var/log/servedat-201605250527.log"
[1] "C 20160525 05:27:47.915 Rotated log file: /var/log/servedat-201605250527.log"
[1] "C 20160525 05:27:47.915 Rotated log file: /var/log/servedat-201605250527.log"
[1] "C 20160525 05:27:47.915 Rotated log file: /var/log/servedat-201605250527.log"

मुझे यह मूल्यांकन करने के लिए कैसे मिल सकता है कि मुझे लाइन की आवश्यकता है या नहीं, और मैं इसे कैसे सही ढंग से संग्रहीत कर सकता हूं (वेक्टर, डेटा फ्रेम, मैट्रिक्स के रूप में, यह वास्तव में मायने नहीं रखता है) ताकि मैं इसे लूप के लिए प्रिंट कर सकूं?

अद्यतन करें

मैंने अपना कोड इसमें बदल दिया है:

    library(stringr)
con <- file("dataSet.txt", open = "r")
Fdata <- data.frame
i <- 1
j <- 1
lineLength <- length(readLines(con))
for (i in 1:lineLength){
line <- readLines(con, 1)
print(line)
if (str_sub(line, 1, 1) == "F" && grepl("\(0\,0\)", line)[i]){
print(line)
Fdata[j,] <- rbind(line)
i <- i + 1
j <- j + 1
}
i <- i + 1
}
print(Fdata)

हालांकि, जब मैं इसे लाइन में संग्रहीत मान की जांच करता हूंकहता है कि यह खाली है। मुझे यह समझ में नहीं आया कि यह क्यों बदल गया। इसके अतिरिक्त, इसने मुझे बताया कि यदि कथन में उचित TRUE / FALSE स्थिति नहीं है, जो मुझे भ्रमित करता है क्योंकि grepl () को TRUE / FALSE मान वापस करना चाहिए।

अद्यतन करें

मैं त्रुटि से छुटकारा पाने में कामयाब रहा, लेकिन मैं अभी भी हूँFdata को कॉल करने पर मुझे कुछ नहीं मिल रहा है। मैंने अपने चर की जाँच की, और आर ने कहा कि रेखा खाली थी, कि इसमें कोई वर्ण नहीं था। क्या मैंने इसे गलत तरीके से असाइन किया है? मैं चाहता हूं कि लाइन मैं डेटा फ़ाइल में पार्स कर रहा हूं और मूल्यांकन कर रहा हूं कि मुझे इसे स्टोर करने की आवश्यकता है या नहीं। यहाँ मेरा अद्यतन कोड है:

library(stringr)
con <- file("dataSet.txt", open = "r")
Fdata <- data.frame
i <- 1
j <- 1
lineLength <- length(readLines("dataSet.txt))
for (i in 1:lineLength){
line <- readLines(con, 1)
print(line)
if (str_sub(line, 1, 1) == "F" && grepl("\(0\,0\)", line)){
print(line)
Fdata[j,] <- rbind(line)
i <- i + 1
j <- j + 1
}
i <- i + 1
}
print(Fdata) 

उत्तर:

जवाब के लिए 2 № 1

इसकी जांच करें:

con <- file("test1.txt", "r")
lines <- c()
while(TRUE) {
line = readLines(con, 1)
if(length(line) == 0) break
else if(grepl("^\s*F{1}", line) && grepl("(0,0)", line, fixed = TRUE)) lines <- c(lines, line)
}

lines
# [1] "F 20160602 14:25:11.321 F7982D50 GET 156.145.15.85:37525 xqixh8sl AES "/pcgc/public/Other/exome/fastq/PCGC0077248_HS_EX__1-06808__v3_FCC49HJACXX_L7_p1of1_P1.fastq.gz" "" 3322771022 (0,0) "1499.61 seconds (17.7 megabits/sec)""

फाइल स्ट्रीम को पास करें readLines ताकि इसे लाइन से लाइन में पढ़ा जा सके। नियमित अभिव्यक्ति का उपयोग करें ^\s*F{1} पत्र के साथ शुरू होने वाली लाइन पर कब्जा करने के लिए F संभव सफेद स्थानों के साथ जहां ^ एक स्ट्रिंग की शुरुआत को निरूपित करें। उपयोग fixed=T के सटीक मैच पर कब्जा करने के लिए (0,0)। अगर दोनों चेक हैं TRUE, परिणाम को लाइनों में जोड़ें।

डेटा:

D 20160602 14:15:43.559 F7982D62 Req Agr:131 Mra:0 Exp:0 Mxr:0 Mnr:0 Mxd:0 Mnd:0 Nro:0
D 20160602 14:15:43.559 F7982D62 Set Agr:130 Mra:0 Exp:0 Mxr:0 Mnr:0 Mxd:0 Mnd:0 Nro:0 I 20160602 14:15:43.559 F7982D62 GET 156.145.15.85:36773 xqixh8sl AES "/pcgc/public/Other/exome/fastq/PCGC0065109_HS_EX__1-04692__v3_FCAD2HMUACXX_L4_p1of1_P2.fastq.gz" ""
M 20160602 14:15:43.595 DOC1: F7982D62 Request for unencrypted meta data on encrypted transaction
M 20160602 14:15:48.353 DOC1: F7982D62 Transaction has been acknowledged at 722875647
F 20160602 14:15:48.398 F7982D62 GET 156.145.15.85:36773 xqixh8sl AES "/pcgc/public/Other/exome/fastq/PCGC0065109_HS_EX__1-04692__v3_FCAD2HMUACXX_L4_p1of1_P2.fastq.gz" "" 50725464 (4,32) "Remote Application: Session Aborted: Aborted by user interrupt"
M 20160602 14:15:48.780 DOC1: F7982D63 New download request D 20160602 14:15:48.780 F7982D63 META: 134 Path: /pcgc/public/CTD/exome/fastq/PCGC0033175_HS_EX__1-00304-01__v1_FCBC0RE4ACXX_L3_p32of96_P2.fastq.gz user: xqixh8sl pack: arg: feat: cE,s
F 20160602 14:25:11.321 F7982D50 GET 156.145.15.85:37525 xqixh8sl AES "/pcgc/public/Other/exome/fastq/PCGC0077248_HS_EX__1-06808__v3_FCC49HJACXX_L7_p1of1_P1.fastq.gz" "" 3322771022 (0,0) "1499.61 seconds (17.7 megabits/sec)"

उत्तर № 2 के लिए 1

यदि आपके पास पर्याप्त मेमोरी है, तो 40,000 लाइनों को "t" होना चाहिएआर को संभालने के लिए बहुत अधिक हो। प्रदर्शन के कारण एक बार में सभी लाइनों पर पढ़ना और परिणामों का विश्लेषण करने के लिए वेक्टर प्रदर्शन का उपयोग करना बेहतर होता है।

आपका कोड इसे सरल बनाया जा सकता है:

library(stringr)

line <- readLines("dataSet.txt")

foundset<-line[which(str_sub(line, 1, 1) == "F" & grepl("(0,0)", line, fixed = TRUE))]
#rm("line")  #include this line to free up memory if there is a concern

यह सभी पंक्तियों में पढ़ता है और "एफ" अक्षर से शुरू होने वाले को हटा देता है। वे सभी पंक्तियाँ वेक्टर फाउंडसेट में हैं।


उत्तर № 3 के लिए 1

कुछ इस तरह का जवाब (R में लाइन-बाय-लाइन पढ़ने का एक अच्छा तरीका क्या है?) भी काम करेगा:

cat("  D 20160602 14:15:43.559 F7982D62 Req Agr:131 Mra:0 Exp:0 Mxr:0 Mnr:0 Mxd:0 Mnd:0 Nro:0",
"D 20160602 14:15:43.559 F7982D62 Set Agr:130 Mra:0 Exp:0 Mxr:0 Mnr:0 Mxd:0 Mnd:0 Nro:0 I 20160602 14:15:43.559 F7982D62 GET 156.145.15.85:36773 xqixh8sl AES "/pcgc/public/Other/exome/fastq/PCGC0065109_HS_EX__1-04692__v3_FCAD2HMUACXX_L4_p1of1_P2.fastq.gz" """,
"M 20160602 14:15:43.595 DOC1: F7982D62 Request for unencrypted meta data on encrypted transaction",
"M 20160602 14:15:48.353 DOC1: F7982D62 Transaction has been acknowledged at 722875647",
"F 20160602 14:15:48.398 F7982D62 GET 156.145.15.85:36773 xqixh8sl AES "/pcgc/public/Other/exome/fastq/PCGC0065109_HS_EX__1-04692__v3_FCAD2HMUACXX_L4_p1of1_P2.fastq.gz" "" 50725464 (4,32) "Remote Application: Session Aborted: Aborted by user interrupt"",
"M 20160602 14:15:48.780 DOC1: F7982D63 New download request D 20160602 14:15:48.780 F7982D63 META: 134 Path: /pcgc/public/CTD/exome/fastq/PCGC0033175_HS_EX__1-00304-01__v1_FCBC0RE4ACXX_L3_p32of96_P2.fastq.gz user: xqixh8sl pack: arg: feat: cE,s")",
"F 20160602 14:15:48.398 F7982D62 GET 156.145.15.85:36773 xqixh8sl AES "/pcgc/public/Other/exome/fastq/PCGC0065109_HS_EX__1-04692__v3_FCAD2HMUACXX_L4_p1of1_P2.fastq.gz" "" 50725464 (4,32) "Remote Application: Session Aborted: Aborted by user interrupt" (0,0)",
file="test",
sep="n")


library(stringr)
con  <- file("test", open = "r")
res<-c()

while (length(oneLine <- readLines(con, n = 1, warn = FALSE)) > 0) {
if (substr(str_trim(oneLine),1,1) =="F" & (regexpr("(0,0)",oneLine)[1] > 0) ){

res<-c(res,oneLine)
}

}

close(con)
res
[1] "F 20160602 14:15:48.398 F7982D62 GET 156.145.15.85:36773 xqixh8sl AES "/pcgc/public/Other/exome/fastq/PCGC0065109_HS_EX__1-04692__v3_FCAD2HMUACXX_L4_p1of1_P2.fastq.gz" "" 50725464 (4,32) "Remote Application: Session Aborted: Aborted by user interrupt" (0,0)"

ध्यान दें कि मैंने उस अंतिम पंक्ति को इस उद्देश्य से जोड़ा है कि कैसे दिखाया जाए while लूप काम करता है।