// librairie de gestion des répertoires et fichiers
const fs = require("fs");
const path = require("path");
// librairie de gestion des arguments de la ligne de commande
var argv = require("optimist").argv;
// librairie de lecture de lignes de texte
var readline = require("readline");
// librairie de traitement du pinyin
const pinyinizer = require("pinyinizer");
// librairie de gestion du hanzi
const opencc = require("node-opencc");
// librairie de gestion des fichiers csv
var csv = require("comma-separated-values");
// librairie de lecture ligne par ligne d'un fichier
const lineReader = require("line-reader");
// Nom du fichier entrée csv
// en entrée, on donne le nom du fichier à traiter sans le répertoire
var repertoireInitial = "./";
var argument = argv._[0];
fichierDonnées = path.join(repertoireInitial, argument);
// DEBUG
// console.log(fichierDonnées);
// Nom du fichier xml
console.log("nom du fichier: ", fichierDonnées)
fichierXml = fichierDonnées.replace(".csv", ".xml");
// DEBUG
// console.log("nom du fichier: ", fichierXml)
var tab = "\t";
var rc = "\n";
// There are 4 types of drills with a different number of fields
// depending of the absence or presence of a cue, and the type of the cue.
var longueur = 0;
// enregistrement des drills à 10 champs
var ligne1 = {
numero: "",
pinyin: "",
hanzi: "",
translation: "",
pinyin1: "",
hanzi1: "",
translation1: "",
themodule: "",
unit: "",
book: "",
};
function resetLigne1() {
numero = "";
pinyin = "";
hanzi = "";
translation = "";
pinyin1 = "";
hanzi1 = "";
translation1 = "";
themodule = "";
unit = "";
book = "";
}
// enregistrement des drills à 11 champs
var ligne2 = {
numero: "",
pinyin: "",
hanzi: "",
translation: "",
cue: "",
pinyin1: "",
hanzi1: "",
translation1: "",
themodule: "",
unit: "",
book: "",
};
function resetLigne2() {
numero = "";
pinyin = "";
hanzi = "";
translation = "";
cue = "";
pinyin1 = "";
hanzi1 = "";
translation1 = "";
themodule = "";
unit = "";
book = "";
}
// enregistrement des drills à 13 champs
var ligne3 = {
numero: "",
pinyin: "",
hanzi: "",
translation: "",
cue_pinyin: "",
cue_hanzi: "",
cue_translation: "",
pinyin1: "",
hanzi1: "",
translation1: "",
themodule: "",
unit: "",
book: "",
};
function resetLigne3() {
numero = "";
pinyin = "";
hanzi = "";
translation = "";
cue_pinyin: "";
cue_hanzi: "";
cue_translation: "";
pinyin1 = "";
hanzi1 = "";
translation1 = "";
themodule = "";
unit = "";
book = "";
}
// la ligne CSV qu'on lit
var ligneCSV = "";
prelude = `
Give affirmative response to all questions.
`;
fin = `
`;
// on ouvre le fichier, on teste la première ligne, on affiche les résultats, et on ferme le fichier:
// il y 10, 11 ou 12 champs suivant l'exercice
// on ouvre et lit le fichier csv à traiter
var fichierATraiter = fs.readFileSync(fichierDonnées, "UTF-8");
// DEBUG
console.log("nom du fichier à traiter: ", fichierDonnées, '\n');
var res = fichierATraiter.split("\n");
var res1 = res[0].split("\t");
longueur = res1.length;
console.log("type d'exercice: ", longueur, " champs");
// on crée et ouvre le fichier de sortie xml
var monxml = fs.createWriteStream(fichierXml);
console.log("fichier créé")
if (longueur == 10) {
console.log('modèle à 10 champs')
var moncsv = new csv(fichierATraiter, {
header: [
"numero",
"pinyin",
"hanzi",
"translation",
"pinyin1",
"hanzi1",
"translation1",
"themodule",
"unit",
"book",
],
cast: [
"String",
"String",
"String",
"String",
"String",
"String",
"String",
"String",
"String",
"String",
],
}).parse();
console.log("fichier parsé")
// écriture du prélude
monxml.write(prelude);
monxml.write(rc);
console.log("prelude écrit")
//
// transformation et écriture des lignes dans le fichier xml
moncsv.forEach(function (enregistrement) {
// écriture de la question
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(enregistrement.numero);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write(
''
);
monxml.write(enregistrement.pinyin);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write(
''
);
monxml.write(enregistrement.hanzi);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write(
''
);
monxml.write(enregistrement.translation);
monxml.write("");
monxml.write(rc);
monxml.write("
");
// écriture de l'espace entre question et réponse
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
// écriture de la réponse
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write('');
monxml.write(enregistrement.pinyin1);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write('');
monxml.write(enregistrement.hanzi1);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(enregistrement.translation1);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("
");
// remise à zéro de l'enregistrement
resetLigne1();
});
} else if (longueur == 11) {
console.log('modèle à 11 champs')
var moncsv = new csv(fichierATraiter, {
header: [
"numero",
"pinyin",
"hanzi",
"translation",
"cue",
"pinyin1",
"hanzi1",
"translation1",
"themodule",
"unit",
"book",
],
cast: [
"String",
"String",
"String",
"String",
"String",
"String",
"String",
"String",
"String",
"String",
"String",
],
}).parse();
// écriture du prélude
monxml.write(prelude);
monxml.write(rc);
//
// transformation et écriture des lignes dans le fichier xml
moncsv.forEach(function (enregistrement) {
// écriture de la question
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(enregistrement.numero);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write(
''
);
monxml.write(enregistrement.pinyin);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write(
''
);
monxml.write(enregistrement.hanzi);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write(
''
);
monxml.write(enregistrement.translation);
monxml.write("");
monxml.write(rc);
monxml.write("
");
// écriture de l'espace entre question et la cue
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
// écriture de la cue
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write('Cue');
monxml.write(enregistrement.cue);
monxml.write("");
monxml.write(rc);
monxml.write("
");
// écriture de l'espace entre la cue et la réponse
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
// écriture de la réponse
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write('');
monxml.write(enregistrement.pinyin1);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write('');
monxml.write(enregistrement.hanzi1);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(enregistrement.translation1);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("
");
// remise à zéro de l'enregistrement
resetLigne2();
});
} else if (longueur == 12) {
console.log('modèle à 12 champs')
} else if (longueur == 13) {
console.log('modèle à 13 champs')
var moncsv = new csv(fichierATraiter, {
header: [
"numero",
"pinyin",
"hanzi",
"translation",
"cue_pinyin",
"cue_hanzi",
"cue_translation",
"pinyin1",
"hanzi1",
"translation1",
"themodule",
"unit",
"book",
],
cast: [
"String",
"String",
"String",
"String",
"String",
"String",
"String",
"String",
"String",
"String",
"String",
"String",
"String",
],
}).parse();
// écriture du prélude
monxml.write(prelude);
monxml.write(rc);
//
// transformation et écriture des lignes dans le fichier xml
moncsv.forEach(function (enregistrement) {
// écriture de la question
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(enregistrement.numero);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write(
''
);
monxml.write(enregistrement.pinyin);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write(
''
);
monxml.write(enregistrement.hanzi);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write(
''
);
monxml.write(enregistrement.translation);
monxml.write("");
monxml.write(rc);
monxml.write("
");
// écriture de l'espace entre question et la cue
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
// écriture de la cue
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write('Cue');
monxml.write('' + enregistrement.cue_pinyin + '');
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write('');
monxml.write('' + enregistrement.cue_hanzi + '');
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write('');
monxml.write(enregistrement.cue_translation);
monxml.write("");
monxml.write(rc);
monxml.write("
");
// écriture de l'espace entre la cue et la réponse
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
// écriture de la réponse
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write('');
monxml.write(enregistrement.pinyin1);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write('');
monxml.write(enregistrement.hanzi1);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(rc);
monxml.write(tab);
monxml.write("");
monxml.write(enregistrement.translation1);
monxml.write("");
monxml.write(rc);
monxml.write("
");
monxml.write(rc);
monxml.write("
");
// remise à zéro de l'enregistrement
resetLigne2();
});
} else {
console.log("Erreur du nombre de champs dans le fichier: ", fichierDonnées);
}
// écriture de la fin dans le fichier xml
monxml.write(fin);
//
// fermeture du fichier de sortie xml
monxml.end();
//
//