我试图弄清楚如何将文本库数据(多选题)表转换成标准格式,其中每个问题都是它自己的单独的.Rnw文件。这使我可以创建一个可与R的考试包一起使用的测试库,以书面或计算机呈现的格式创建不同的考试。
我有表格格式(.csv)的测试库数据,结构化数据如下所示(用分号分隔):
question.no;question.text;choice.a;choice.b;choice.c;choice.d;choice.e;answer;label.1;label.2
1;This is the question text of 1;text of choice a;text of choice b;text of choice c;text of choice d;text of choice e;A;question.type.1;question.type.2
2;This is the question text of 2;text of choice a;text of choice b;text of choice c;text of choice d;text of choice e;A;question.type.1;question.type.2
我想做的是解析此文件,为每行数据创建一个单独的.Rnw文件,其中第1行的输出为:
\begin{question}
This is the question text of 1
\begin{answerlist}
\item text of choice a
\item text of choice b
\item text of choice c
\item text of choice d
\item text of choice e
\end{answerlist}
\end{question}
\begin{solution}
The right answer is A
\end{solution}
\exname{defaggdemand}
\extype{schoice}
% \label.1{question.type.1}
% \label.2{question.type.2}
% \exsolution{10000}
\exshuffle{TRUE}
该文件将被命名为“ question_1.Rnw”,第2行的输出类似如下:
\begin{question}
This is the question text of 2
\begin{answerlist}
\item text of choice a
\item text of choice b
\item text of choice c
\item text of choice d
\item text of choice e
\end{answerlist}
\end{question}
\begin{solution}
The right answer is A
\end{solution}
\exname{defaggdemand}
\extype{schoice}
% \label.1{question.type.1}
% \label.2{question.type.2}
% \exsolution{10000}
\exshuffle{TRUE}
,该文件基于.csv数据的第一列,称为“ question_2.Rnw”。
这个想法是,该策略将以一个大的.csv表作为输入,并输出到目录中,每行testbank数据一个.Rnw文件,将数据从csv转换为一个testbank问题目录,可用于考试包。
在执行此操作之前,我曾经使用过诸如sed或正则表达式之类的文本解析方法来修复打印的文本库问题集,但这是我第一次以这种结构化,统一的格式获取测试库数据。
我确定我可以将某种文本替换方法融合在一起,该方法将采用每个定界符并替换正确的文本和行返回集,但这似乎容易出错,我怀疑这是一种最优雅的方法。
我希望您能找到有关如何解决此问题的任何指示。
答案 0 :(得分:2)
抢救Perl!
“问题”模板保留在“数据”部分中。 Text::CSV_XS用于处理csv。 CSV的第一行被跳过(第一列包含question.no
),其他行用于填充模板-每个%1
,%2
等被相应的替换列值。结果保存到从第一列创建名称的文件中。
#!/usr/bin/perl
use warnings;
use strict;
use Text::CSV_XS qw{ csv };
my $template = do { local $/; <DATA> };
csv(in => shift,
sep_char => ';',
out => \ 'skip',
on_in => sub {
return if 'question.no' eq $_[1][0];
open my $out, '>', "question_$_[1][0].Rnw" or die $!;
( my $output = $template ) =~ s/%([0-9])/$_[1][$1]/g;
print {$out} $output;
close $out;
});
__DATA__
\begin{question}
%1
\begin{answerlist}
\item %2
\item %3
\item %4
\item %5
\item %6
\end{answerlist}
\end{question}
\begin{solution}
The right answer is %7
\end{solution}
\exname{defaggdemand}
\extype{schoice}
% \label.1{%8}
% \label.2{%9}
% \exsolution{10000}
\exshuffle{TRUE}
答案 1 :(得分:1)
$ cat tst.awk
BEGIN { FS=";" }
NR>1 {
out = "\\begin{question}"
out = out ORS $2
for (i=3; i<=7; i++) {
out = out ORS "\\item " $i
}
out = out ORS "\\end{answerlist}"
out = out ORS "\\end{question}"
out = out ORS
out = out ORS "\\begin{solution}"
out = out ORS "The right answer is " $(i++)
out = out ORS "\\end{solution}"
out = out ORS
out = out ORS "\\exname{defaggdemand}"
out = out ORS "\\extype{schoice}"
c=0
for (; i<=NF; i++) {
out = out ORS "% \\label." ++c "{" $i "}"
}
out = out ORS "\\exsolution{10000}"
out = out ORS "\\exshuffle{TRUE}"
print out " > " ("question_" NR-1 ".Rnw")
close("question_" NR-1 ".Rnw")
}
。
$ awk -f tst.awk file
\begin{question}
This is the question text of 1
\item text of choice a
\item text of choice b
\item text of choice c
\item text of choice d
\item text of choice e
\end{answerlist}
\end{question}
\begin{solution}
The right answer is A
\end{solution}
\exname{defaggdemand}
\extype{schoice}
% \label.1{question.type.1}
% \label.2{question.type.2}
\exsolution{10000}
\exshuffle{TRUE} > question_1.Rnw
\begin{question}
This is the question text of 2
\item text of choice a
\item text of choice b
\item text of choice c
\item text of choice d
\item text of choice e
\end{answerlist}
\end{question}
\begin{solution}
The right answer is A
\end{solution}
\exname{defaggdemand}
\extype{schoice}
% \label.1{question.type.1}
% \label.2{question.type.2}
\exsolution{10000}
\exshuffle{TRUE} > question_2.Rnw
$
只需将" > "
更改为>
。
答案 2 :(得分:0)
这是您可以在python中进行的操作。
基本上,您逐行读取文件。 忽略第一行,因为它似乎只是列描述。 从第二行开始,分割定界符上的每一行。将列表值分配给一堆变量以供以后参考。 打开一个要写入的新文件。使用f.write选项写出您的模板以及上面保存的变量。
with open("q-and-a-sheet-template.csv", "r") as infile:
next(infile)
filecount = 1
for line in infile:
if line:
num, question_text, choice_a, choice_b, choice_c, choice_d, choice_e, answer, tag1, tag2 = line.split(';')
outfile = "outfile"+str(filecount)+".rnw"
with open(outfile, "a") as f:
f.write("\\begin{question}\n")
f.write(question_text+"\n")
f.write("\\begin{answerlist}\n")
f.write("\\"+choice_a+"\n")
f.write("\\"+choice_b+"\n")
f.write("\\"+choice_c+"\n")
f.write("\\"+choice_d+"\n")
f.write("\\"+choice_e+"\n")
f.write("\\end{answerlist}\n")
f.write("\\end{question}\n")
f.write("\n")
f.write("\\begin{solution}\n")
f.write("The right answer is" + answer +"\n")
f.write("\\end{solution}\n")
f.write("\n")
f.write("\\exname{defaggdemand}\n")
f.write("\\extype{schoice}\n")
f.write("% \\label.1{"+tag1+"}\n")
f.write("% \\label.1{"+tag2+"}\n")
f.write("% \\exsolution{10000}\n")
f.write("\\exshuffle{TRUE}")
filecount += 1