Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从R中的文本文件中提取元素_R_Tidyr_Tidyverse_Stringr_Tidytext - Fatal编程技术网

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

从R中的文本文件中提取元素,r,tidyr,tidyverse,stringr,tidytext,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

我试图进入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)

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

[我不得不在你的数据集末尾添加几个字符,我从你的正则表达式推断出:

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.*”
,然后让R尝试解析结果。如果不匹配,它仍会抱怨

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

str_extract_all(txt, regex("^TD\\s+(^\\s{3}.*\\n)+", multiline = TRUE))
(请注意,正则表达式类
\s
包含
\n
,因此在匹配
TD
行后,我不需要显式指定该类)

如果字段丢失,请小心
最后,如果输入中有一个TD或PD字段丢失,您当前的方法可能会为文本指定错误的日期!使用
for
循环与
readLines
组合,而不是正则表达式匹配,可能会有助于此:

[我不得不在从正则表达式推断出的数据集末尾添加几个字符:

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.*”
,然后让R尝试解析结果。如果不匹配,它仍会抱怨

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

str_extract_all(txt, regex("^TD\\s+(^\\s{3}.*\\n)+", multiline = TRUE))
(请注意,正则表达式类
\s
包含
\n
,因此在匹配
TD
行后,我不需要显式指定该类)

如果字段丢失,请小心
最后,如果输入中有一个TD或PD字段丢失,您当前的方法可能会为文本指定错误的日期!使用
for
循环与
readLines
相结合,而不是正则表达式匹配,可能会有助于实现此目的:

Hi@akraf-谢谢您的帮助。但是,我无法获得所需的结果。是不是e有一种方法可以将我的工作R脚本发送给您查看。谢谢您hi@akraf-谢谢您的帮助。但是,我无法获得所需的结果。有没有方法可以将我的工作R脚本发送给您查看。谢谢