首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从R中的文本文件中提取元素

从R中的文本文件中提取元素
EN

Stack Overflow用户
提问于 2018-04-04 10:23:07
回答 1查看 69关注 0票数 0

我正试图进入R中的文本分析,我有一个具有以下结构的文本文件。

代码语言:javascript
复制
HD  A YEAR Oxxxx
 WC 244 words
 PD 28 February 2018
 SN XYZ
 SC hydt
 LA English
 CY Copyright 2018 

 LP Rio de Janeiro, Feb 28



TD
   With recreational cannabis only months away from legalization in Canada, companies are racing to
   prepare for the new market. For many, this means partnerships, supply agreements,

我想在R中提取以下元素(PD和TD),并保存到一个表中。

我已经试过了,但是我没能把它做对。

提取物PD

代码语言:javascript
复制
library(stringr)
library(tidyverse)

pd <- unlist(str_extract_all(txt, "\\bPD\\b\t[0-9]+?\\s[A-Za-z]+?\\s[0-9]+\\s"))
pd <- str_replace_all(pd, "\\bPD\\b\t", "")
if (length(pd) == 0) {
  pd <- as.character(NA)
}
pd <- str_trim(pd)
pd <- as.Date(strptime(pd, format = "%d %B %Y"))

提取物TD

代码语言:javascript
复制
td <- unlist(str_extract_all(txt, "\\bTD\\b[\\t\\s]*?.+?\\bCO\\b"))
td <- str_replace_all(td, "\\bTD\\b[\\t\\s]+?", "")
td <- str_replace_all(td, "\\bCO\\b", "")
td <- str_replace_all(td, "\\s+", " ")
if (length(td) == 0) {
  td <- as.character(NA)

请给我以下的桌子:

代码语言:javascript
复制
PD                        TD
28 February 2018          With recreational cannabis only months away from 
                          legalization in Canada, companies are racing to
                          prepare for the new market. For many, this means 
                          partnerships, supply agreements, Production hit a 
                          record 366.5Mt

任何帮助都将不胜感激。谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-04-04 12:37:26

[我不得不在数据集的末尾添加几个字符,这是我从您的regexes中推断出来的:

代码语言:javascript
复制
txt <- "HD  A YEAR Oxxxx
 WC 244 words
 PD 28 February 2018
 SN XYZ
 SC hydt
 LA English
 CY Copyright 2018 

 LP Rio de Janeiro, Feb 28



TD
   With recreational cannabis only months away from legalization in Canada, companies are racing to
   prepare for the new market. For many, this means partnerships, supply agreements,
CO ...further stuff"

脏的

解决问题的方法可能是:

  • 对于date字段,修复它期望的正则表达式不是选项卡,而是PD文本之后的任意空格。\\bPD\\b [0-9]+?\\s[A-Za-z]+?\\s[0-9]+\\s"为我工作。
  • 对于TD字段,使用dotall=选项使regex多行:(参见?stringr::regex) td <- unlist(str_extract_all(txt,regex("\bTD\b\t\s*?.+?\bCO\b",dotall=TRUE))

也许短时间的雷克斯更好?

但是,我建议您捕获输入格式的特征,只需细粒度即可。例如,我不会通过regex检查日期格式。只需搜索"^ PD.*"并让R尝试解析结果。如果不匹配的话,它还是会抱怨的。

要筛选以多个空格开头的文本块,如TD标记之后的空格,您可以使用multiline=选项来使用^来匹配每一行(不仅仅是第一行)。例如。

代码语言:javascript
复制
str_extract_all(txt, regex("^TD\\s+(^\\s{3}.*\\n)+", multiline = TRUE))

(请注意regex类\s包含\n,因此我不需要在匹配TD行之后显式地指定)

如果字段丢失,请小心

最后,如果输入中有一个TD或PD字段丢失,则当前的方法可能会将错误的日期分配给文本!将for循环与readLines (而不是regex匹配)组合起来可能有助于实现这一点:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49648624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档