Запуск al oop для нескольких xml файлов в одной папке в R - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь запустить этот скрипт как функцию oop, так как у меня в папке более 200 файлов, и я пытаюсь создать один файл CSV в конце, перечисляя все данные, которые мне нужно извлечь.

Я пробовал разные способы запуска этого в al oop например, В R, как извлечь два значения из файла XML, зациклить 5603 файла и записать в таблицу

Всякий раз, когда я пробую эти разные варианты, я получаю сообщения об ошибках типа:

Ошибка: XML содержимое не похоже на XML или в доступе отказано.

Однако, когда я запускаю код, выбирая только один файл, он работает нормально. Эти ошибки появляются только при попытке преобразовать его в функцию al oop для нескольких файлов в одной папке.

Вот исходный код, используемый для одного файла:

doc<-xmlParse("//file/path/32460004.xml")
xmldf <- xmlToDataFrame(nodes = getNodeSet(doc, "//BatRecord"))

df1 <- data.frame(xmldf)
df1 <- separate(df1, xmldf.DateTime, into = c("Date", "Time"), sep = " ")
df1$Lat <- substr(xmldf$GPS,4,12)
df1$Long <- substr(xmldf$GPS,13,25)
df_final <- data.frame(df1$xmldf.Filename, df1$Date, df1$Time, df1$xmldf.Duration, df1$xmldf.Temperature, df1$Lat, df1$Long)
colnames(df_final) <- c("Filename", "Date", "Time", "Call Duration", "Temperature", "Lat", "Long")

write.csv(df_final, "//file/path/test_file.csv")

Вот ссылка на некоторые примеры файлов:

https://drive.google.com/drive/folders/1ZvmOEWhzlWHRl2GxZrbYY9y7YSZ5j9Fj?usp=sharing

Любая помощь приветствуется.

Вот детали моей версии:

platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          3                           
minor          6.3                         
year           2020                        
month          02                          
day            29                          
svn rev        77875                       
language       R                           
version.string R version 3.6.3 (2020-02-29)
nickname       Holding the Windsock   

1 Ответ

2 голосов
/ 10 апреля 2020

Это должно работать с использованием tidyverse и xml2.

require(tidyverse)
require(xml2)

### Put all your xml files in a vector
my_files <- list.files("path/to/your/xml/files", full.names = TRUE)

### Read function to transform them to tibble (similar to data.frame)
read_my_xml <- function(x, path = "//BatRecord") {
  tmp <- read_xml(x) # read the xml file
  tmp <- tmp %>% 
    xml_find_first(path) %>% # select the //BatRecord node
    xml_children # select all children of that node

  # this extracts the text of all children 
  # aka the text between the > TEXT </ Tags
  out <- tmp %>% xml_text 
  # Takes the names of the tags <NAME> ... </NAME>
  names(out) <- tmp %>% xml_name
  # Turns out to tibble - see https://stackoverflow.com/q/40036207/3301344
  bind_rows(out)
}

### Read the files as data

dat <- map_df(my_files, read_my_xml) # map_df is similar to a loop + binding it to one tibble

### To the transformation

dat %>% 
  separate(DateTime, into = c("Date", "Time"), sep = " ") %>% 
  mutate(Lat = substr(GPS,4,12), Long = substr(GPS,13,25)) %>% 
  write_csv("wherever/you/want/file.txt")
...