R 如何在文本中按时间顺序搜索某些元素以创建简化的数据框架

R 如何在文本中按时间顺序搜索某些元素以创建简化的数据框架,r,string,function,loops,apply,R,String,Function,Loops,Apply,数据简介 我有一个文本文件或csv,其中包含一个网站的编码,在那里我无法将数据导出到excel工作表。这意味着数据本身是一堆代码,其中元素由特定的文本位区分 了解数据 外汇。每个变量都以开头。变量x中的每个元素都有一个以… y有一个以..开头的代码,其中该元素的值以开头。 每个变量的编码以及与此变量相关的底层代码以开头 数据结构 So the structure of the file is as following: `<a:PLI>` <a:DT&g

数据简介

我有一个文本文件或csv,其中包含一个网站的编码,在那里我无法将数据导出到excel工作表。这意味着数据本身是一堆代码,其中元素由特定的文本位区分

了解数据

外汇。每个变量都以
开头。变量x中的每个元素都有一个以
y有一个以
..
开头的代码,其中该元素的值以
开头。 每个变量的编码以及与此变量相关的底层代码以
开头

数据结构

So the structure of the file is as following: 


   `<a:PLI>`
      <a:DT>...
       `<a:FN>...` 
          `<a:KY>...`
           <a:VL>...
    `<a:PLI>`
      <a:DT>...
       `<a:FN>...` 
           `<a:KY>...`
            <a:VL>...
因此文件的结构如下所示:
``
...
`...` 
`...`
...
``
...
`...` 
`...`
...
导入到R时,dataframe只有一列,总共约35.000行。每一位代码都有自己的行

我希望做什么和预期结果

我想做的是将这个复杂的文本文件转换成一个新的数据框架,其中包含我感兴趣的所有元素

例如,对于每个组/变量
(a(很抱歉,前面的回答错误,我错过了你问题的一个重要部分)

以下是我将如何做到这一点:

  • 将文本包装在一对标记中,使其成为有效的xml(即,添加根节点)
  • 删除所有“a:”(命名空间前缀)
  • 然后,在R中:

    library(xml2)
    foo <- read_xml("tmp.xml")
    
    # convert to a nodeset
    allplis <- xml_find_all(foo, "//PLI")
    
    xtractpli <- function(x) {
      dt <- xml_text(xml_find_first(x, "DT"))
      fn <- xml_text(xml_find_first(x, "FN"))
      orgkey <- xml_find_first(x, "PSPS/PSP[KY='org-key']")
      orgkey <- xml_text(xml_find_first(orgkey, "VL"))
      return(c(fn, dt, orgkey))
    }
    
    t(sapply(allplis, xtractpli))
    
    这就是你想要的吗?

    (很抱歉之前的错误答案,我错过了你问题的一个重要部分)

    以下是我将如何做到这一点:

  • 将文本包装在一对标记中,使其成为有效的xml(即,添加根节点)
  • 删除所有“a:”(命名空间前缀)
  • 然后,在R中:

    library(xml2)
    foo <- read_xml("tmp.xml")
    
    # convert to a nodeset
    allplis <- xml_find_all(foo, "//PLI")
    
    xtractpli <- function(x) {
      dt <- xml_text(xml_find_first(x, "DT"))
      fn <- xml_text(xml_find_first(x, "FN"))
      orgkey <- xml_find_first(x, "PSPS/PSP[KY='org-key']")
      orgkey <- xml_text(xml_find_first(orgkey, "VL"))
      return(c(fn, dt, orgkey))
    }
    
    t(sapply(allplis, xtractpli))
    

    这就是您想要的吗?

    您实际上是在处理一种XML,其中
    之前的
    a
    被称为其“名称空间”。假设其余数据与您提供的示例类似,您可以使用类似以下代码的方式提取数据,其中
    s
    是您提供的数据(您需要将
    s
    替换为您的文件名):

    库(rvest)
    图书馆(purrr)
    图书馆(dplyr)
    变量%
    html_节点(“pli”)%>%
    取消分类()%>%
    map_df(~map2(列表(.)、变量、~html_文本(html_节点(.x,.y)))%>%
    设置\u名称(变量)%>%
    作为_utible,,
    .id=“pli”
    )
    
    我使用
    read_html
    而不是
    read_xml
    ,因为在这种情况下,它可以很好地解析xml,而且我不想在名称空间中胡闹。我不能保证这会一直起作用。您的示例数据中似乎只有一个名称空间,所以您可能不会有问题

    之后,我使用
    html\u节点
    拉出三个
    pli
    节点,然后使用
    unclass
    将XML节点集转换为一个列表。在
    map\u df
    中,我迭代三个列表元素(三个
    pli
    节点),并应用
    map2
    ,其中我使用
    vars
    中的值拉出所有相关节点,并将输出存储在一个TIBLE中。结果如下所示:

    # A tibble: 8 x 8
      pli   dt         dtr        desc           fn        ti    ky              vl            
      <chr> <chr>      <chr>      <chr>          <chr>     <chr> <chr>           <chr>         
    1 1     False      False      text text text Type      80200 org-group       40100         
    2 1     False      False      text text text Type      80200 org-key         60205         
    3 1     False      False      text text text Type      80200 org-systemkey   1005          
    4 1     False      False      text text text Type      80200 org-report-type text text text
    5 2     Room       Room       ""             StartRoom 12500 org-group       13020         
    6 2     Room       Room       ""             StartRoom 12500 org-key         13130         
    7 3     Other room Other room ""             StartRoom 15552 org-group       11160         
    8 3     Other room Other room ""             StartRoom 15552 org-key         15152    
    
    #一个tible:8 x 8
    pli dt dtr desc fn ti ky vl
    1 1 False False文本类型80200组织组40100
    2 1错误文本类型80200组织密钥60205
    3 1 False False文本类型80200组织系统密钥1005
    4 1 False False文本类型80200组织报告类型文本
    5 2房间“StartRoom 12500组织组13020
    6 2房间“StartRoom 12500组织钥匙13130
    7.3其他房间其他房间“StartRoom 15552组织组11160
    8.3其他房间其他房间“StartRoom 15552组织钥匙15152
    
    您实际上是在处理一种XML,其中
    之前的
    a
    被称为其“名称空间”。假设其余数据与您提供的示例类似,您可以使用类似于以下代码的代码提取数据,其中
    s
    是您提供的数据(您需要将
    s
    替换为您的文件名):

    库(rvest)
    图书馆(purrr)
    图书馆(dplyr)
    变量%
    html_节点(“pli”)%>%
    取消分类()%>%
    map_df(~map2(列表(.)、变量、~html_文本(html_节点(.x,.y)))%>%
    设置\u名称(变量)%>%
    作为_utible,,
    .id=“pli”
    )
    
    我使用
    read_html
    而不是
    read_xml
    ,因为在这种情况下,它可以很好地解析xml,而且我不想在名称空间中胡闹。我不能保证这会一直起作用。您的示例数据中似乎只有一个名称空间,所以您可能不会有问题

    之后,我使用
    html\u节点
    拉出三个
    pli
    节点,然后使用
    unclass
    将XML节点集转换为一个列表。在
    map\u df
    中,我迭代三个列表元素(三个
    pli
    节点),并应用
    map2
    ,其中我使用
    vars
    中的值拉出所有相关节点,并将输出存储在一个TIBLE中。结果如下所示:

    # A tibble: 8 x 8
      pli   dt         dtr        desc           fn        ti    ky              vl            
      <chr> <chr>      <chr>      <chr>          <chr>     <chr> <chr>           <chr>         
    1 1     False      False      text text text Type      80200 org-group       40100         
    2 1     False      False      text text text Type      80200 org-key         60205         
    3 1     False      False      text text text Type      80200 org-systemkey   1005          
    4 1     False      False      text text text Type      80200 org-report-type text text text
    5 2     Room       Room       ""             StartRoom 12500 org-group       13020         
    6 2     Room       Room       ""             StartRoom 12500 org-key         13130         
    7 3     Other room Other room ""             StartRoom 15552 org-group       11160         
    8 3     Other room Other room ""             StartRoom 15552 org-key         15152    
    
    #一个tible:8 x 8
    pli dt dtr desc fn ti ky vl
    1 1 False False文本类型80200组织组40100
    2 1
    
    # A tibble: 8 x 8
      pli   dt         dtr        desc           fn        ti    ky              vl            
      <chr> <chr>      <chr>      <chr>          <chr>     <chr> <chr>           <chr>         
    1 1     False      False      text text text Type      80200 org-group       40100         
    2 1     False      False      text text text Type      80200 org-key         60205         
    3 1     False      False      text text text Type      80200 org-systemkey   1005          
    4 1     False      False      text text text Type      80200 org-report-type text text text
    5 2     Room       Room       ""             StartRoom 12500 org-group       13020         
    6 2     Room       Room       ""             StartRoom 12500 org-key         13130         
    7 3     Other room Other room ""             StartRoom 15552 org-group       11160         
    8 3     Other room Other room ""             StartRoom 15552 org-key         15152