преобразование данных из табличного (.csv) формата в текстовые файлы - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь выяснить, как преобразовать таблицу данных банка текста (вопросы с несколькими вариантами ответов) в стандартный формат, где каждый вопрос представляет собой отдельный отдельный файл .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}

и этот файл называется «question_2.Rnw», основываясь на первом столбце данных .csv.

Идея состоит в том, что стратегия будет принимать в качестве входных данных большую таблицу .csv и выводить в каталог по одному файлу .Rnw на строку данных testbank, переводя данные из csv в каталог вопросов testbank, готовых для использования с пакет экзаменов.

Я использовал подходы к синтаксическому анализу текста, такие как sed или регулярные выражения, для исправления набора вопросов в наборе напечатанных текстовых банков, прежде чем делать это, но я впервые получаю данные тестового банка в таком структурированном, унифицированном формате.

Я уверен, что мог бы собрать воедино какой-то подход замещения текста, который бы использовал каждый разделитель и заменял правильный текст и набор возвращаемых строк, но это кажется подверженным ошибкам, и я подозреваю, что есть самый элегантный способ.

Буду признателен за любые указания о том, как выяснить, как это сделать.

Ответы [ 3 ]

0 голосов
/ 27 января 2019
$ 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
$

Просто измените " > " на >.

0 голосов
/ 30 июля 2019

Вот как вы могли бы сделать это в 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
0 голосов
/ 27 января 2019

Perl на помощь!

Шаблон для вопросов хранится в разделе DATA. 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}
...