将LaTeX生成的索引的组合修改为有用的数据框

时间:2017-08-20 12:53:00

标签: r regex latex knitr

我的几个文档通过RStudio作为PDF输出,.Rnw脚本,knitrLaTeX都有冗长的索引。 readLines可以读入R每个文档的索引(" file.ind"文件),并将它们全部合并到一个字符向量中。

向量如下所示,但PDF文档缩进\ item项下的\ subitem术语(我称之为' Secondary'术语)(我称之为'主要'术语) )。合并后的矢量包含20多个主要术语(例如数据统计)和2,000个辅助术语(例如'分布,钟形曲线,正常,20) 。主要术语可以包含5到50+次要术语。

\item Data
\subitem distribution, bell curve, normal, 20
\subitem absolute number, 111
\subitem arithmetic mean, 21
\subitem big data, 137
\subitem binary, 110
\subitem categorical, 130
\item Statistics
\subitem count, 53
\subitem data, 53, 129
\subitem data, missing, 135
\subitem digits, 53

编程挑战是"填写"主要术语,直到下一个主要术语开始,然后填写第二个主要术语,直到下一个术语开始,依此类推。或者,R如何使用两列创建一个看起来像这样的对象?

Primary Secondary
Data    distribution, bell curve, normal, 20
Data    absolute number, 111
Data    arithmetic mean, 21
Data    big data, 137
Data    binary, 110
Data    categorical, 130
Statistics  count, 53
Statistics  data, 53, 129
Statistics  data, missing, 135
Statistics  digits, 53

我的目标是在Excel中保存修改后的组合索引,以便我可以更轻松地标准化命名约定,检测缺失的术语,修复拼写错误等。

感谢您提供任何指导。

1 个答案:

答案 0 :(得分:0)

我认为以下内容应该有效(完全未经测试,但大多数测试过)。您可以逐行读取输入文件,然后处理两种类型的输入:

  • 该行以\item开头
    • 在这种情况下,记录新的主要标签,但不要实际上向数据框写入任何内容
  • 该行以\subitem开头
    • 在这种情况下,使用最新的主要行和当前行的次要行写入数据帧


df <- data.frame(Primary=character(),
                 Secondary=character(),
                 stringsAsFactors=FALSE) 

# replace 'filepath' with the actual path to your file
con = file(filepath, "r")
primary <- NA
secondary <- NA
while (TRUE) {
    line <- readLines(con, n=1)
    if (length(line) == 0) {
        break
    }
    if (substr(line, 2, 5) == 'item') {
        primary <- gsub("\\\\item\\s+(.*)", "\\1", line)
    }
    else if (substr(line, 2, 8) == 'subitem') {
        secondary <- gsub("\\\\subitem\\s+(.*)", "\\1", line)
        df$Primary <- primary
        df$Secondary <- secondary
    }
    else {
        print(paste0("Unexpected input: ", line))
    }
}
close(con)

请注意,如果您不知道文件的实际路径是什么,那么只需在Windows资源管理器中查找该文件并复制该路径即可。在Linux上,您可以查找该文件,或查找其位置并键入pwd

<强>更新

根据您的评论,听起来好像您向我们展示的数据已经在角色向量中。您可以将上面的内容简化为以下内容:

primary <- NA
secondary <- NA
for (i in 1:length(IndxAll)) {
    line <- IndxAll[i]
    if (length(line) == 0) {
        break
    }
    if (substr(line, 2, 5) == 'item') {
        primary <- gsub("\\\\item\\s+(.*)", "\\1", line)
    }
    else if (substr(line, 2, 8) == 'subitem') {
        secondary <- gsub("\\\\subitem\\s+(.*)", "\\1", line)
        df$Primary <- primary
        df$Secondary <- secondary
    }
    else {
        print(paste0("Unexpected input: ", line))
    }
}