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

R 将LaTeX生成的索引组合修改为有用的数据框,r,regex,latex,knitr,R,Regex,Latex,Knitr,通过RStudio、.Rnw脚本、knitr和LaTeX以PDF格式输出的一些文档都有很长的索引readLines可以读入R每个文档的索引(一个“file.ind”文件),我将它们组合成一个字符向量 向量如下所示,但PDF文档将\subitem术语(我称之为“次要”术语)缩进到\item术语(我称之为“主要”术语)下。组合向量有20多个主要项(如数据和统计)和2000个次要项(如“分布、钟形曲线、正态分布、20”)。一个主要术语可以有5到50个以上的次要术语 \item Data \subite

通过RStudio、
.Rnw
脚本、
knitr
LaTeX
以PDF格式输出的一些文档都有很长的索引
readLines
可以读入
R
每个文档的索引(一个“file.ind”文件),我将它们组合成一个字符向量

向量如下所示,但PDF文档将\subitem术语(我称之为“次要”术语)缩进到\item术语(我称之为“主要”术语)下。组合向量有20多个主要项(如数据统计)和2000个次要项(如“分布、钟形曲线、正态分布、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中保存修改后的组合索引,这样我就可以更容易地标准化命名约定、检测缺少的术语、修复拼写错误等等


谢谢您的指导。

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

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


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

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


对不起,我需要一些关于你代码的指导。如果我的包含所有组合索引的文件(看起来像我在问题中包含的第一个数据位)被称为“IndxAll”,为什么我需要再次使用file()和readLines()?我已经用我认为简洁而正确的解决方案回答了您的问题。如果你不喜欢,你可以等待其他答案,或者自己试试。你的编码能力远远超过我。我相信答案是简洁和正确的,但一点注释将极大地帮助我和其他读者能够实现它。我的评论只是想试着理解你如此娴熟地写了些什么。我只走了这么远。con=file(filepath,“r”)文件中的错误(filepath,“r”):对象“filepath”不是found@lawyeR在Windows上,只需使用文件的绝对路径,例如
C:\\users\\lawyer\\input.txt
。。。除此之外,我的脚本的其余部分应该是pump和dump;您已经开始使用.ind文件(目前有10个)。我已经阅读并清理了它们,所以我在问题中复制的是当前的格式。您将substr()行基于此,但在原始的.ind文件中,它是非常不同的。如何使用我的R对象作为起点,然后使用与这两个要点相关的代码?对不起,我需要一些关于代码的指导。如果我的包含所有组合索引的文件(看起来像我在问题中包含的第一个数据位)被称为“IndxAll”,为什么我需要再次使用file()和readLines()?我已经用我认为简洁而正确的解决方案回答了您的问题。如果你不喜欢,你可以等待其他答案,或者自己试试。你的编码能力远远超过我。我相信答案是简洁和正确的,但一点注释将极大地帮助我和其他读者能够实现它。我的评论只是想试着理解你如此娴熟地写了些什么。我只走了这么远。con=file(filepath,“r”)文件中的错误(filepath,“r”):对象“filepath”不是found@lawyeR在Windows上,只需使用文件的绝对路径,例如
C:\\users\\lawyer\\input.txt
。。。除此之外,我的脚本的其余部分应该是pump和dump;您已经开始使用.ind文件(目前有10个)。我已经阅读并清理了它们,所以我在问题中复制的是当前的格式。您将substr()行基于此,但在原始的.ind文件中,它是非常不同的。如何使用我的R对象作为起点,然后使用与这两个要点相关的代码?
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)
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))
    }
}