我正在编写一个脚本,它进入我们的机器并解析一个跟踪文件,这是一个txt文件。我需要一个特定值,在本例中为"RP",并从该数据创建一个数据帧。现在我有了所有这些行,但没有列。我想分成几列。下面是grep之后的样子。
1 2016-03-14 09:52:38> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0004
我想要的是。日期压力2016-03-14 09:52:38 rp+0004
options(warn=-1)
#Select Copy From Dir, Change \\ to /
copyfrom<-gsub("\\\\","/",choose.dir(default = "", caption = "Select folder you wish to copy files from"))
#File names
listfiles<-list.files(copyfrom)
#Total amount of files
totalfiles=length(listfiles)
#Select Copy To Dir, Change \\ to /
copyto<-gsub("\\\\","/",choose.dir(default = "", caption = "Select folder you wish to copy files to"))
#Loop through all files in direct
for (totalfiles in 1:totalfiles)
{
#Opening the file based on how many files present
con <- file(paste0(copyfrom,"/",listfiles[totalfiles]))
#open connection to file
open(con);
#read file
read <- readLines(con)
#search file for particular value
searched_entries = grep("RP", read, value = T)
#write file, remove .trc from file name and add _parsed
writeLines(searched_entries, con = paste0(copyto,"/",gsub(".trc","",listfiles[totalfiles]),"_parsed.txt"))
#close connection and print total files parsed
close(con)
print(totalfiles)
}以下是数据框:
2016-03-14 09:52:38> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0004 2016-03-14 09:52:39> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:39> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:39> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000等。
我想结束与2列,一个与日期(2016-03-14 09:52:3),另一个与RP编号(rp+0000)让我知道,如果你想让我进一步澄清。
这是Trace文件。您可以将此文件复制粘贴到记事本中,然后将其另存为文件名为StarLineDailyMaintenance_8715f3804819481aae1cae3a479556aa_Trace.trc的.txt文件
2016-03-14 09:52:38> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0004 2016-03-14 09:52:39> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:39> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:39> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:40> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:40> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:40> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:41> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:41> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:41> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:42> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:42> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:42> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:43> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:43> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:43> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:44> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:44> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:45> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:45> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:45> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:46> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:46> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:46> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:47> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:47> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:47> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:48> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:48> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:48> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0000 2016-03-14 09:52:49> Microlab®STAR :固件命令(单步)-完成;> RP: rp+4067 2016-03-14 09:52:50> Microlab®STAR :固件命令(单步)-完成;> RP: rp+4057 2016-03-14 09:52:50> Microlab®STAR :固件命令(单步)-完成;> RP: rp+4028 2016-03-14 09:52:51> Microlab®STAR :固件命令(单步)-完成;> RP: rp+4057 2016-03-14 09:52:52> Microlab®STAR :固件命令(单步)-完成;> RP: rp+4082 2016-03-14 09:52:52> Microlab®STAR :固件命令(单步)-完成;> RP: rp+4125 2016-03-14 09:52:53> Microlab®STAR :固件命令(单步)-完成;> RP: rp+4082
发布于 2016-03-15 05:23:08
您可以使用字符串r中的str_match和正则表达式来解析这些行;
> library(stringr)
> df
# V1
# 1 2016-03-14 09:52:38> Microlab® STAR : Firmware Command (Single Step) - complete; > RP: rp+0004
# 2 2016-03-14 09:52:39> Microlab® STAR : Firmware Command (Single Step) - complete; > RP: rp+0000
# 3 2016-03-14 09:52:39> Microlab® STAR : Firmware Command (Single Step) - complete; > RP: rp+0000
# 4 2016-03-14 09:52:39> Microlab® STAR : Firmware Command (Single Step) - complete; > RP: rp+0000
> f <- as.data.frame(str_match(df$V1, '^([^>]*)>[^>]*> RP: ([^ ]*) *$')[,-1])
> colnames(f) = c('Date', 'Pressure')
> f
# Date Pressure
# 1 2016-03-14 09:52:38 rp+0004
# 2 2016-03-14 09:52:39 rp+0000
# 3 2016-03-14 09:52:39 rp+0000
# 4 2016-03-14 09:52:39 rp+0000看起来有点复杂的正则表达式基本上获取了到第一列的第一个>之前的所有内容,以及> RP:之后到第二列的所有内容。
假设文件是以给定格式换行分隔的,您也可以使用gsubfn中的read.pattern直接解析文件中的数据,并使用相同的正则表达式;
> library(gsubfn)
> f = read.pattern('Test/test.txt', '^([^>]*)>[^>]*> RP: ([^ ]*) *$')
> colnames(f) = c('Date', 'Pressure')
> f
# Date Pressure
# 1 2016-03-14 09:52:38 rp+0004
# 2 2016-03-14 09:52:39 rp+0000
# 3 2016-03-14 09:52:39 rp+0000
# 4 2016-03-14 09:52:39 rp+0000https://stackoverflow.com/questions/35997308
复制相似问题