首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中,我有一个没有列的数据框,并希望将其拆分为不同的列

在R中,我有一个没有列的数据框,并希望将其拆分为不同的列
EN

Stack Overflow用户
提问于 2016-03-15 04:21:23
回答 1查看 54关注 0票数 0

我正在编写一个脚本,它进入我们的机器并解析一个跟踪文件,这是一个txt文件。我需要一个特定值,在本例中为"RP",并从该数据创建一个数据帧。现在我有了所有这些行,但没有列。我想分成几列。下面是grep之后的样子。

1 2016-03-14 09:52:38> Microlab®STAR :固件命令(单步)-完成;> RP: rp+0004

我想要的是。日期压力2016-03-14 09:52:38 rp+0004

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2016-03-15 05:23:08

您可以使用字符串r中的str_match和正则表达式来解析这些行;

代码语言:javascript
复制
> 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直接解析文件中的数据,并使用相同的正则表达式;

代码语言:javascript
复制
> 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+0000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35997308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档