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

时间:2018-04-04 10:23:08

标签: r tidyr tidyverse stringr tidytext

我正在尝试在R中进行文本分析。我有一个具有以下结构的文本文件。

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

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 <- 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)

我想要表格如下:

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

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

1 个答案:

答案 0 :(得分:2)

[我必须在数据集的末尾添加几个字符,我从你的正则表达式中推断出来了:

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"

解决问题的方法可能是:

  • 对于日期字段,修复它不需要选项卡的正则表达式,而是PD文本后面的任意空格。例如。 \\bPD\\b [0-9]+?\\s[A-Za-z]+?\\s[0-9]+\\s"适合我。
  • 对于TD字段,请使用dotall=选项使您的正则表达式多行:(请参阅?stringr::regex

    td <- unlist(str_extract_all(txt, regex("\\bTD\\b[\\t\\s]*?.+?\\bCO\\b", dotall=TRUE)))
    

也许更短的正则表达式更好?

但是,我建议您只根据需要捕获输入格式的特征。例如,我不会通过正则表达式检查日期格式。只需搜索"^ PD.*"并让R尝试解析结果。如果它不匹配,它会抱怨。

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

str_extract_all(txt, regex("^TD\\s+(^\\s{3}.*\\n)+", multiline = TRUE))

(请注意,正则表达式类\s包含\n,所以我不需要在匹配TD行后明确指定

如果字段丢失,请小心

最后,如果输入中缺少某个TD或PD字段,您当前的方法可能会为文本分配错误的日期!与for结合而不是正则表达式匹配的readLines循环可能对此有所帮助: