Я пытаюсь расположить текстовый файл, который выглядит следующим образом:
<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