Есть ли лучший способ добавить идентификатор столбца в зависимости от шаблонов - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь расположить текстовый файл, который выглядит следующим образом: <IDFILE>0001</IDFILE> 20200404;154200;174.79 20200404;154800;175.47 20200404;155400;173.87 20200404;160000;172.17 20200404;160600;171.58 20200404;161200;168.54 20200404;161800;167.26 <IDFILE>0002</IDFILE> 20200404;154200;12.10 20200404;154800;12.09 20200404;155400;12.09 20200404;160000;12.08 20200404;160600;12.07 20200404;161200;12.06 20200404;161800;12.06 <IDFILE>0010</IDFILE> 20200404;160000;13.8 Это пример текстового файла ("20200404161846.txt"). У меня есть тысячи текстовых файлов, которые все еще имеют эту структуру. Но количество данных по «IDFILE» может измениться. Действительно, в этом случае есть 7 строк для файлов идентификаторов "0001" и "0002", но они могут содержать меньше или больше в другом текстовом файле.

Я хотел бы иметь следующую таблицу с 2 столбцами:

"RAWdata"   "FILES"
"<IDFILE>0001</IDFILE>" "<IDFILE>0001</IDFILE>"
"20200404;154200;174.79"    "<IDFILE>0001</IDFILE>"
"20200404;154800;175.47"    "<IDFILE>0001</IDFILE>"
"20200404;155400;173.87"    "<IDFILE>0001</IDFILE>"
"20200404;160000;172.17"    "<IDFILE>0001</IDFILE>"
"20200404;160600;171.58"    "<IDFILE>0001</IDFILE>"
"20200404;161200;168.54"    "<IDFILE>0001</IDFILE>"
"20200404;161800;167.26"    "<IDFILE>0001</IDFILE>"
"<IDFILE>0002</IDFILE>" "<IDFILE>0002</IDFILE>"
"20200404;154200;12.10" "<IDFILE>0002</IDFILE>"
"20200404;154800;12.09" "<IDFILE>0002</IDFILE>"
"20200404;155400;12.09" "<IDFILE>0002</IDFILE>"
"20200404;160000;12.08" "<IDFILE>0002</IDFILE>"
"20200404;160600;12.07" "<IDFILE>0002</IDFILE>"
"20200404;161200;12.06" "<IDFILE>0002</IDFILE>"
"20200404;161800;12.06" "<IDFILE>0002</IDFILE>"
"<IDFILE>0010</IDFILE>" "<IDFILE>0010</IDFILE>"
"20200404;160000;13.8"  "<IDFILE>0010</IDFILE>"

Я нашел это решение, но может быть лучший и более быстрый способ сделать это преобразование. Есть ли функция или решение без for для l oop? На самом деле я знаю, что l oop не очень эффективен в R, но я не могу найти другой метод. Мне приходится каждый день преобразовывать много текстовых файлов, поэтому я хотел бы оптимизировать этот шаг.

rm(list=ls()) 

#Open data and rename column by "RAWdata"
MyTABdata = read.table(file = "20200404161846.txt", header = F, col.names = "RAWdata", sep = "")

#To search lines with MyDIRpattern in MyTABdata
MyDIRpattern = "<IDFILE>" 
MyDIRpattern_IDrows  =grep(pattern = MyDIRpattern,x = MyTABdata$RAWdata) # refer to the number of id lines which begin with pattern "<IDFILE>" 
MyDIRpattern_values = grep(pattern = MyDIRpattern,x = MyTABdata$RAWdata,value = TRUE,) # refer to the values of lines which begin with pattern "<IDFILE>" 

#Create a vector of ID rows which contained pattern 
VectorID = c(MyDIRpattern_IDrows,nrow(MyTABdata)+1)

#Create a temporary vector which allow us to replicate 
VectorRep_tmp=rep(NA,length(MyDIRpattern_IDrows))

#For loop to calcule the number of rows per IDFILE thanks to "VectorID"
for (i in 1:length(MyDIRpattern_IDrows)) {
  VectorRep_tmp[i]= abs(VectorID[i+1]-VectorID[i])
  print(VectorRep_tmp)
}

#Create column with corresponding IDFILE at each row of MyTABdata  
MyTABdata$FILES = rep(MyDIRpattern_values,VectorRep_tmp)
#Split tab by IDFILE
LIST_MyTABdata= split(MyTABdata,MyTABdata$FILES)

Спасибо за помощь!

F

...