在 R 中以块的形式读取和解析 xml
read and parse a xml in chunks in R
我正在尝试使用 R 从维基百科转储中读取和处理 ~5.8GB .xml
。我没有那么多 RAM,所以我想分块处理它。 (目前使用 xml2::read_xml
完全阻塞我的电脑)
该文件包含每个维基百科页面的一个 xml
元素,如下所示:
<page>
<title>AccessibleComputing</title>
<ns>0</ns>
<id>10</id>
<redirect title="Computer accessibility" />
<revision>
<id>631144794</id>
<parentid>381202555</parentid>
<timestamp>2014-10-26T04:50:23Z</timestamp>
<contributor>
<username>Paine Ellsworth</username>
<id>9092818</id>
</contributor>
<comment>add [[WP:RCAT|rcat]]s</comment>
<model>wikitext</model>
<format>text/x-wiki</format>
<text xml:space="preserve">#REDIRECT [[Computer accessibility]]
{{Redr|move|from CamelCase|up}}</text>
<sha1>4ro7vvppa5kmm0o1egfjztzcwd0vabw</sha1>
</revision>
</page>
可以找到文件示例here
从我的角度来看,我认为可以分块读取它,就像文件中的一页一页一样。 Ans 将每个处理过的 page
元素作为一行保存在 .csv
文件中。
我想要一个包含以下列的 data.frame。
id、标题和文本。
如何分块阅读此 .xml
?
可以改进,但主要思想在这里。您仍然需要定义最佳方式来定义您要在 readLines()
函数内的每个交互中读取的行数,以及读取每个块的方法,但是获取块的解决方案在这里:
xml <- readLines("ptwiki-20161101-pages-articles.xml", n = 2000)
inicio <- grep(pattern = "<page>", x = xml)
fim <- grep(pattern = "</page>", x = xml)
if (length(inicio) > length(fim)) { # if you get more beginnings then ends
inicio <- inicio[-length(inicio)] # drop the last one
}
chunks <- vector("list", length(inicio))
for (i in seq_along(chunks)) {
chunks[[i]] <- xml[inicio[i]:fim[i]]
}
chunks <- sapply(chunks, paste, collapse = " ")
我试过 read_xml(chunks[1]) %>% xml_nodes("text") %>% xml_text()
并且成功了。
我正在尝试使用 R 从维基百科转储中读取和处理 ~5.8GB .xml
。我没有那么多 RAM,所以我想分块处理它。 (目前使用 xml2::read_xml
完全阻塞我的电脑)
该文件包含每个维基百科页面的一个 xml
元素,如下所示:
<page>
<title>AccessibleComputing</title>
<ns>0</ns>
<id>10</id>
<redirect title="Computer accessibility" />
<revision>
<id>631144794</id>
<parentid>381202555</parentid>
<timestamp>2014-10-26T04:50:23Z</timestamp>
<contributor>
<username>Paine Ellsworth</username>
<id>9092818</id>
</contributor>
<comment>add [[WP:RCAT|rcat]]s</comment>
<model>wikitext</model>
<format>text/x-wiki</format>
<text xml:space="preserve">#REDIRECT [[Computer accessibility]]
{{Redr|move|from CamelCase|up}}</text>
<sha1>4ro7vvppa5kmm0o1egfjztzcwd0vabw</sha1>
</revision>
</page>
可以找到文件示例here
从我的角度来看,我认为可以分块读取它,就像文件中的一页一页一样。 Ans 将每个处理过的 page
元素作为一行保存在 .csv
文件中。
我想要一个包含以下列的 data.frame。
id、标题和文本。
如何分块阅读此 .xml
?
可以改进,但主要思想在这里。您仍然需要定义最佳方式来定义您要在 readLines()
函数内的每个交互中读取的行数,以及读取每个块的方法,但是获取块的解决方案在这里:
xml <- readLines("ptwiki-20161101-pages-articles.xml", n = 2000)
inicio <- grep(pattern = "<page>", x = xml)
fim <- grep(pattern = "</page>", x = xml)
if (length(inicio) > length(fim)) { # if you get more beginnings then ends
inicio <- inicio[-length(inicio)] # drop the last one
}
chunks <- vector("list", length(inicio))
for (i in seq_along(chunks)) {
chunks[[i]] <- xml[inicio[i]:fim[i]]
}
chunks <- sapply(chunks, paste, collapse = " ")
我试过 read_xml(chunks[1]) %>% xml_nodes("text") %>% xml_text()
并且成功了。