我从事数据管理工作,这意味着人们会给我原始数据,我必须对其进行格式化和解析,以获得我需要的部分并以有意义的方式组织它。目前我使用的数据是一个日志文件,但我打开并将其保存为文本文件。看起来有点像这样:
M 20160525 09:51:11.822 DOC1:清除过期DENIED在39411ms后发送至1864130A.62274 13
D 20160525 09:51:11.824 F798257E获取10.19.100.24:62274 van8tc - " / pcgc / public / Other /" " *利"完成
M 20160525 09:51:11.825 DOC1:F798257E交易已于15804727确认
F 20160525 09:51:11.825 F798257E获取10.19.100.24:62274 van8tc - " / pcgc / public / Other /" " *利" 441(0,0)" 0.10秒(36.8千比特/秒)" D 20160525 09:51:11.825 F798257E获取10.19.100.24:62274 van8tc - " / pcgc / public / Other /" " *利" - "解放包裹单位"
它是一个非常大的文件,我不希望将整个内容导入到R中,主要是因为它占用了大量的空间。每行都有"字段" (我想组织和分开的)指定如下:
我需要的唯一行是以F开头且有(0,0)错误的行。这是一个示例行:
F 20160525 17:52:38.791 F798259D GET 156.145.15.85:46634 xqixh8sl AES" /pcgc/public/Other/exome/fastq/PCGC0053681_HS_EX__1-02598__v1_FCAD18P7ACXX_L8_p92of93_P1.fastq.gz" "" 2951144113(0,0)" 2289.47秒(10.3兆比特/秒)"
我不会考虑像这样的一行:
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)"远程应用程序:会话中止:由用户中断中止"
上面的行没有(0,0)错误,因此不予考虑。
我的问题是:由于文件太大,我希望能够通过它解析并只选择我需要的行。然后,一旦我导入它,我想要最好的方式来整理它。我知道有多种方法可以阅读该文件(我一直尝试使用readLines()
和scan()
)但我不知道如何在条件语句中写入(行必须以F开头,并且必须有(0,0)错误。
我尝试过各种各样的事情:
使用scan()
将整个文件作为列表导入R.
x <- scan("dataSet.txt", what = list(lineID = "", date = "", timestamp = "", transferID = "", IP = "", username = "", encryption = "", transferredFile = "", error = "", data = ""), sep = " ", fill = TRUE, strip.white = TRUE)
logs <- list(x)
logs
虽然我喜欢编号和行,但它遗漏了我需要的很多字段。这是它给我的输出:
[9062]&#34;&#34;
[9063]&#34;&#34;
[9064]&#34;&#34;
[9065]&#34;&#34;
[9066]&#34;&#34;
[9067]&#34;&#34;
[9068]&#34;&#34;
[9069]&#34;&#34;
[9070]&#34;&#34;
[9071]&#34;&#34;
[9072]&#34;&#34;
[9073]&#34; Mnr:0&#34;
[9074]&#34;&#34;
[9075]&#34; Mnr:0&#34;
[9076]&#34;&#34;
[9077]&#34;&#34;
[9078]&#34;数据&#34;
[9079]&#34;&#34;
[9080]&#34; 2,&#34;
[9081]&#34; 12,&#34;
[9082]&#34;&#34;
[9083]&#34;&#34;
[9084]&#34; 550F919C.60099&#34;
> setwd("/Users/kimm5w/Intern Work")
> dataset <- list()
> con <- file("dataSet.txt")
> open(con)
> dataset <- grep("F", scan("dataSet.txt", what = list(lineID = "", date = "", timestamp = "", transferID = "", IP = "", username = "", encryption = "", transferredFile = "", error = "", data = ""), sep = " ", fill = TRUE, strip.white = TRUE), perl = TRUE, value = TRUE)
> dataset
这是它给我的输出,这不是我想要的格式:
\"[0]\", \"\", \"xqixh8sl:\", \"\", \"\", \"\", \"\", \"Mnr:0\", \"\", \"Mnr:0\", \"\", \"\", \"data\", \"\", \"at\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"Mnr:0\", \"\", \"Mnr:0\", \"\", \"\", \"data\", \"\", \"at\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"Mnr:0\", \"\", \"Mnr:0\", \"\", \"\", \"data\", \"\", \"550F919C.36474\", \"\", \"550F919C.42385\", \"\", \"550F919C.49879\", \"\", \"550F919C.53923\", \"\", \"6,\", \"18,\", \"\", \"550F919C.36773\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"at\", \"\", \"\", \"\", \"\", \"\", \n\"\", \"\", \"550F919C.37525\", \"\", \"6,\", \"18,\", \"\")"
我是R的新人;我学习了Java,虽然概念很相似,但语法却不熟悉。如果有人可以帮我这个,请做!我已经在这方面工作了大约一个星期而无法解决这个问题。谢谢你的帮助!
更新
这是我在完成你的建议后到目前为止所做的尝试:
setwd("/Users/kimm5w/Intern Work")
df<-data.frame(readLines("dataSet.txt"))
F_dataSet <- grep("^F.*(0,0)", "dataSet.txt")
F_dataSet
library(stringr)
x = 0
while(x < length(readLines("dataSet.txt"))){
line <- readLines("dataSet.txt")
if (str_sub(line, 1, 1) == 'F' & grepl('\\(0\\,0\\)', line)[1]){
F_data <- c(F_data, line)
}
}
display(F_data)
出于某种原因,当我尝试在R中运行它时,它不会显示结果。但是,它确实运行没有错误。我的问题是,其中一个是否有效。我无法使用for循环,因为确切的行数并不知道。所以相反,我尝试在第二个版本中使用while循环。该链接很有用,但有点令人困惑,因为我不熟悉语法。如果有人可以解释每个部分,我认为它会更容易理解。在第一次尝试时,我只是尝试使用grep()来排序我需要的行,但我不确定它是否有效。如果有人可以从这里帮忙,那将非常感激。那些给我答案的人,谢谢你。这对我帮助很大,而且是我一段时间以来取得的最大进步。
这是另一个更新。它运行正常,但由于某种原因while循环不打印任何东西。当我尝试显示它时,F_data不会显示。有人可以指出错误在哪里吗?
setwd("/Users/kimm5w/Intern Work")
F_data <- data.frame
print(F_data)
library(stringr)
x <- length(readLines("dataSet.txt"))
print(x)
while(x != 0)
{
line <- readline("dataSet.txt")
print(line)
if (str_sub(line, 1, 1) == 'F' & grepl('\\(0\\,0\\)', line)[1]){
F_data <- c(F_data, line)
print(F_data)
}
x <- x + 1
}
close(con)
F_data
答案 0 :(得分:0)
也许这是一个警察,但如果您担心在R
会话期间保留记忆,请不要在R
会话中执行此操作。您可以在将其读入R
之前使用grep 对文件进行预处理。
grep "^F.*(0,0)" dataSet.txt > processed_dataSet.txt
答案 1 :(得分:0)
让我们说你读了第一行,使用readLines函数和for循环或其他东西。然后,您可以使用简单的搜索来查看您的行是否以&#34; F&#34;如果它包含&#34;(0,0)&#34;。例如:
library(stringr)
line='F 20160525 09:51:11.825 F798257E GET 10.19.100.24:62274 van8tc - "/pcgc/public/Other/" "*li" 441 (0,0) "0.10 seconds (36.8 kilobits/sec)" D 20160525 09:51:11.825 F798257E GET 10.19.100.24:62274 van8tc - "/pcgc/public/Other/" "*li" - "Freeing Package Unit"'
if(str_sub(line,1,1)=='F' & grepl('\\(0\\,0\\)', line)[1]){
relevant_guys<-c(relevant_guys, line)
}
通过这种方式,您不必将整个文件放入内存中,并逐行评估。