一般情况下,我正在尝试创建R代码,从不同的txt文件(test1.txt,test2.txt,...)中读取问题并创建一个文件(exam.txt)。换句话说,我有不同的问题池文件,我想从中创建一个考试文件。问题类型(真/假,多选,简答题,填空格,表匹配)。我选择使用txt文件的原因是因为R不支持MS docx文件(除非我经历漫长的过程as pointed in this blog)
我找到exams package来创建考试,这不是我想要的。
一种简单的方法是逐个读取文件并将问题转储到一个文件中(exam.txt)。我面临两个问题:
1 - 如何将已读取的内容写入文件(exam.txt注意:txt或csv或xlsx没问题,但是,为了简单起见,我更喜欢txt)并保持打开以用于下一个文件内容。
2-如何选择从每个文件中读取的问题数量。
我尝试了以下内容:
ReadTxt<-function(){
fileName="test1.txt"
conn=file(fileName,open="r",encoding = 'UTF-8')
linn=readLines(conn)
for (i in 1:length(linn)){
if (!(grepl("#",linn[i])) )
cat(linn[i],"\n")
}
close(conn)
}
我在每个txt文件中使用#
作为问题之间的分隔符。这就是我使用grepl命令的原因。
test1.txt:
First question goes here
#
Second question
#
Third question
#
完整的R代码将是这样的:
createExam<-function(){
ReadTxt("test1.txt")
#ReadTxt("test2.txt")
#ReadTxt("test3.txt")
}
ReadTxt<-function(fname){
fileName=fname
conn=file(fileName,open="r",encoding = 'UTF-8')
linn=readLines(conn)
for (i in 1:length(linn)){
if (!(grepl("#",linn[i])) )
cat(linn[i],"\n")
}
close(conn)
}
答案 0 :(得分:1)
您可以先读取内存中的所有问题,然后将其写入磁盘
考虑您的测试文件:
$ cat test1.txt
1 First question goes here
#
1 Second question
#
1 Third question
#
$ cat test2.txt
2 First question goes here
#
2 Second question
#
2 Third question
#
$ cat test3.txt
3 First question goes here
#
3 Second question
#
3 Third question
#
此R语法读取内存中的所有文件,然后将问题的子集打印到文件
createExam<-function(){
res <- list()
res <- ReadTxt("test1.txt", res)
res <- ReadTxt("test2.txt", res)
res <- ReadTxt("test3.txt", res)
return(res)
}
ReadTxt<-function(fname, res){
fileName=fname
conn=file(fileName,open="r",encoding = 'UTF-8')
linn=readLines(conn)
for (i in 1:length(linn)){
if (!(grepl("#",linn[i])) )
res[[length(res)+1]]<-linn[i]
}
close(conn)
return(res)
}
questions <- createExam()
subset <- questions[c(1,2,4,5,7,8)]
conn=file("exam.txt",open="w",encoding = 'UTF-8')
for (i in 1:length(subset)){
writeLines(subset[[i]], conn)
}
close(conn)
以上给出了结果
$ Rscript t.R
$ cat exam.txt
1 First question goes here
1 Second question
2 First question goes here
2 Second question
3 First question goes here
3 Second question