0
votes

Conversion des données du format tabulaire (.csv) en fichiers texte

J'essaie de déterminer comment convertir une table de données de la banque texte (questions à choix multiples) dans un format standard où chaque question est qu'elle est propre fichier distinct .RNW. Cela me permet de créer une banque d'essai que je peux utiliser avec le package d'examens pour R pour créer des examens différents dans des formats écrits ou informatiques présentés.

J'ai des données bancaires testées en format tabulaire (.csv) où les données structurées ressemblent à ceci (délimité par point-virgule): xxx

Ce que je voudrais faire est Pour analyser ce fichier pour créer un fichier .RNW distinct pour chaque ligne de données, où la sortie de la ligne 1 serait: xxx

et ce fichier serait nommé "Question_1. RNW ", et la sortie de la ligne 2 semblerait analoguer comme ceci: xxx

et ce fichier appelé s'appelle" question_2.rnw ", en fonction de la première colonne de la. Données CSV.

L'idée est que la stratégie prendrait une grande table .CSV en tant qu'entrée et sortie à un fichier répertoire un fichier répertoire par ligne de données TestBank, traduisant les données de la CSV dans un répertoire des questions de testBank prêtes à être utilisées avec le package d'examens.

J'ai utilisé des approches d'analyse de texte tels que SED ou des expressions régulières pour réparer un ensemble de questions de texte imprimé de questions avant de le faire, mais c'est la première fois que je avoir des données de testBank dans un format aussi structuré et uniforme.

Je suis sûr que je pouvais regrouper une sorte d'approche de substitution de texte qui prendrait chaque délimiteur et remplacerait le bon texte et le bon retour des rendements de la ligne, mais cela semble sujette d'erreur, et je soupçonne qu'il y a un manière la plus élégante.

J'apprécierais tous les indicateurs sur la façon de comprendre comment faire cela.


3 commentaires

Modifier Votre question pour montrer ce que vous avez essayé jusqu'à présent.


Ed, je ne pense pas que tout ce que j'ai essayé jusqu'à présent est que cela est utile, mais je prends que vous pointez que vous soyez diligent et bon citoyen ici. J'ai essayé votre code, essayant de le faire fonctionner pour moi. Le TST.AWK est-il censé référencer le fichier texte (ce que j'avais ci-dessus en tant que fichier .csv avec les données)? Je ne l'ai pas encore travaillé, mais je suis sûr que ce n'est que mon ignorance, pas l'aide que vous m'avez donnée. Peut-être avec cette direction, je peux y arriver. Merci pour votre aide, ed.


S'il vous plaît mettre des commentaires liés à ma réponse sous ma réponse pour garder la question bien rangée pour tout le monde, merci. Mais dans tous les cas, vous venez de créer un fichier nommé Tst.awk contenant exactement ce que je montre à contenir (c'est-à-dire le script AWK), puis l'exécuter à l'aide de AWK aussi exactement comme je montrais. J'ai nommé le fichier d'entrée (que vous vous référez comme un fichier CSV) comme fichier .


3 Réponses :


2
votes

Perl à la rescousse!

Un modèle de questions est conservé dans la section Données. Texte :: CSV_XS est utilisé pour traiter le CSV. La première ligne du CSV est ignorée (où la première colonne contient question.no code>), d'autres lignes sont utilisées pour remplir le modèle - chaque % 1 code>, % 2 code>, etc. sont remplacés par la valeur de colonne correspondante. Le résultat est enregistré dans le fichier dont le nom a été créé à partir de la première colonne. P>

#!/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}


2 commentaires

Choroba, merci pour la réponse détaillée! J'essaie de la mettre en œuvre, mais je suis un néophyte complet sur Perl. essayé d'exécuter votre code à partir d'un fichier .pl. Je ne peux pas trouver le texte / csv_xs.pm dans @inc (vous devrez peut-être installer le texte du texte :: CSV_XS). Je ne dois pas avoir installé ce texte-CSV correctement. continuera à essayer.


Votre gestionnaire de packages système peut fournir un package PERL-TEXT-CSV_XS ou similaire.



1
votes
$ 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
$

1 commentaires

Cela a fonctionné pour moi. Je pense que je sais maintenant comment ajuster le script un peu à un peu plus de travail pour moi, mais c'est beaucoup d'aide.



0
votes

Voici comment vous pourriez le faire en python.

Fondamentalement, vous lisez la ligne de fichier par ligne. Ignorer la première ligne car il semble être juste des descriptions de colonne. De deuxième ligne sur, diviser chaque ligne sur le délimiteur. Attribuez les valeurs de la liste aux bouchons de variables pour se reporter ultérieurement. Ouvrez un nouveau fichier à écrire à. Utilisez une option F.Write pour écrire votre modèle combiné aux variables enregistrées ci-dessus. xxx


0 commentaires