Novice dans la programmation

Fermé
Realness Messages postés 33 Date d'inscription lundi 2 octobre 2017 Statut Membre Dernière intervention 26 mars 2018 - 17 mars 2018 à 22:33
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 27 mars 2018 à 18:30
Bonjour,

Je suis doctorant en langues étrangères et pour m’aider dans ma thèse, j’aimerais créer un logiciel qui recherche et pointe des mots de vocabulaire en rentrant trois nombres qui constituent ensemble des coordonnées.

Je m’explique, je suis en train d’apprendre le grec moderne, et j’ai eu l’idée de numéroter les mots de vocabulaire faisant parti d’un énorme fichier pdf : prenons par exemple le verbe « ξεδιψω » (Ksedipso) qui siginie « étancher sa soif ».

Il porte les coordonnées 14;86;16 ou 148616 puisque chaque mot a son propre « « Serial Number ». Et je voudrais, quand je rentre ces trois nombres dans mon futur logiciel ou même le nombre entier, directement avoir le mot qui apparaît sans m’embêter à le chercher dans le fichier pdf et le noter dans Excel.

Donc ma question, c’est comment m’y prendre ? Je suis prêt à tout programmer moi-même, j’ai également le code source du fichier pdf mais je ne sais vraiment pas par où commencer.

Merci pour votre attention

11 réponses

Utilisateur anonyme
Modifié le 18 mars 2018 à 14:06
Bien

il te faut choisir un langage, cet article peut t'y aider
https://www.commentcamarche.net/faq/457-programmation-comment-debuter-quel-langage

La plupart dispose d'outils (API ou bibliothèque) permettant de lire un pdf et d'autre pour écrire dans excel.

Une fois choisi, suis un cours en ligne pour apprendre les bases.
Fais le bien du début à la fin (même si ça te parrait simple, parfois on rate une notion qui s'avère cruciale par la suite). Ceux de developpez.com sont généralement bien


Après passe à ton programme, y'a plusieurs approches,

option 1

  • tu tapes tes coordonnées (peu importe le format)
  • le programme vérifie dans le stock (à définir) que tu l'as pas déjà.
  • si tu l'as message d'erreur et arrêt de la recherche
  • le programme va lire le pdf,
  • vérifie que la page contient des mots qui commence par la bonne lettre,
  • si oui cherche le mot
    • écrit dans excel
    • stocke les coordonnées
  • si non message d'erreur

option 2

  • une fois pour toute tu transferts tous tes mots dans une base de données (qui peut être un fichier excel, mais aussi un csv, un xml un json, Access, sql ,etc.... )
    • chaque mot possède une clé unique qui est la coordonnée.
    • chaque mot possède son orthographe
    • chaque mot possède sa définition
    • chaque mot possède son type (verbe, nom, article etc...)
    • chaque mot possède son genre (si ça existe en grec)
    • bref chaque mot possède tout ce qui le définit.
  • dans ton programme,
  • tu tapes la coordonnées
  • le programme vérifie qu'elle existe
  • si oui écrit dans excel et strocke
  • si non message d'erreur

option 3

je n'y ai pas réfléchi


Je pense que l'option 2 sera plus rapide à l'exécution.




1
Realness Messages postés 33 Date d'inscription lundi 2 octobre 2017 Statut Membre Dernière intervention 26 mars 2018
18 mars 2018 à 14:21
Super, je te remercie pour ces deux options. J'ai choisi le langage C et je commence à taper des lignes de codes dans Code::Blocks, avec un manuel en parallèle. Tu penses que ça fera l'affaire?
0
Utilisateur anonyme
18 mars 2018 à 14:29
Le C est l'un des langages les plus durs à apprendre.
Il sert en électronique ou de base d'apprentissage pour les analystes programmeurs (et encore de moins en moins).

Python est assez accessible, gratuit et nativement multiplateforme.
Java est plus performant, gratuit et nativement multiplateforme.
C# est aussi performant que Java, gratuit dans certaines condition et optionable en multiplateforme.

Je code en C#, donc évidement c'est par ce langage que j'aborderais ton projet, mais les 2 autres en raison de leur gratuité sont des choix plus que judicieux.
0
Utilisateur anonyme
18 mars 2018 à 10:16
Bonjour

Elle correspondent à quoi ces coordonnées?
Numéro de page, numéro de ligne numéro de mot?
0
Realness Messages postés 33 Date d'inscription lundi 2 octobre 2017 Statut Membre Dernière intervention 26 mars 2018
18 mars 2018 à 10:18
Numéro de lettre, numéro de pages et numéro de mot
0
Utilisateur anonyme
18 mars 2018 à 13:11
Numéro de lettre?
Ça ne représente pas un mot alors, mais une lettre?
0
Realness Messages postés 33 Date d'inscription lundi 2 octobre 2017 Statut Membre Dernière intervention 26 mars 2018
18 mars 2018 à 13:29
En fait, tout part d'un fichier pdf, qui contient les 24 lettres de l'alphabet grec moderne et que j'ai numéroté de 1 à 24.

α = 1,
β = 2,
γ = 3,
δ = 4,
ε = 5,
ζ = 6,
η = 7,
θ = 8
...
ω = 24

Ces lettres commencent à des endroits différents du fichier et répertorient à la façon d'un dictionnaire des mots de vocabulaire en grec.

Donc, tu es d'accord avec moi que si le générateur me donne le numéro 1 comme première coordonnée, on atterri dans le champ de la lettre α? Mais ce n'est pas suffisant, puisque sur les 136 pages du fichier, la lettre α s'étale de la page 14 à 24.

Il me faut alors une deuxième coordonnée allant de 14 à 24. Prenons par exemple le nombre 20. Mais ce n'est pas suffisant encore, puisque la page 20 contient 24 mots de vocabulaire. Il me faut donc une troisième coordonnée allant de 1 à 24. Prenons 16...

... et rassemblons les 3 coordonnées ensemble :

Numéro de lettre : 1
Numéro de page : 20
Numéro de mot : 16

Résultat : αντίστροφα (compter à l'envers)

Parce qu'un fichier vaut mieux que mille mots : http://www.ilsp.gr/files/Glossary-Filoglossia.pdf
0
Utilisateur anonyme
18 mars 2018 à 13:39
Ok, du coup page 20 mot 16 suffit non?
0
Realness Messages postés 33 Date d'inscription lundi 2 octobre 2017 Statut Membre Dernière intervention 26 mars 2018
18 mars 2018 à 13:41
Je sais pas, ce que je voudrais principalement c'est qu'une sorte de générateur me donne une combinaison, comme celle du dessus (12016), me sorte le mot en question et surtout qu'il ne me donne pas une combinaison déjà vue
0
Realness Messages postés 33 Date d'inscription lundi 2 octobre 2017 Statut Membre Dernière intervention 26 mars 2018
18 mars 2018 à 18:13
Ok, je vais me pencher sur le sujet du coup! Le truc c'est que je suis en train d'apprendre le langage C mais je sais même pas si c'est ce langage qui est utilisé pour le code source du fichier pdf. Il commence comme cela :

%PDF-1.5
%âãÏÓ
500 0 obj
<</Linearized 1/L 1292154/O 502/E 6339/N 139/T 1282033/H [ 396 5494]>>
endobj

xref
500 5
0000000016 00000 n
0000005890 00000 n
0000006011 00000 n
0000006259 00000 n
0000000396 00000 n
trailer
<</Size 505/Root 501 0 R/Info 499 0 R/ID[<6946955E25179E4E97B2D01B352D523D><6E0118A2EF1E5641B29160F0379DD859>]/Prev 1282021>>
startxref
0
%%EOF

Il suffit que je copie-colle ce morceau dans Code::Blocks et il plante systématiquement, il n'y a plus rien à faire...
0
Utilisateur anonyme
18 mars 2018 à 18:16
Un pdf c'est un fichier, c'est pas du code exécutable.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Realness Messages postés 33 Date d'inscription lundi 2 octobre 2017 Statut Membre Dernière intervention 26 mars 2018
18 mars 2018 à 18:18
Ce qui veut dire? Même sans copier-coller le texte juste au-dessus et en essayant un tout à fait différent Code::Blocks plante
0
Utilisateur anonyme
18 mars 2018 à 19:14
Comme je te l'ai dit plus haut je fais du C#, je ne connais pas (ou très très peu) le C ni code::block.
0
Realness Messages postés 33 Date d'inscription lundi 2 octobre 2017 Statut Membre Dernière intervention 26 mars 2018
18 mars 2018 à 19:15
Pas de soucis de toutes façons j'ai désinstallé et réinstallé Code:Blocks et tout est rentré dans l'ordre
0
Realness Messages postés 33 Date d'inscription lundi 2 octobre 2017 Statut Membre Dernière intervention 26 mars 2018
Modifié le 18 mars 2018 à 19:19
Re de nouveau, j'ai un début prometteur avec cette formule, qui consiste en la première coordonnées :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

int Random (int _iMin, int _iMax)
{
return (_iMin + (rand () % (_iMax-_iMin+1)));
}

int main (void)
{
int iRandom;

srand (time (NULL));
iRandom = Random (1,24);
printf ("Random : %d", iRandom);
getch();
return 0;
}

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>


Reste à savoir comment succéder les deux autres coordonnées et à ce que le programme ne me redonne pas deux fois la même
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 19 mars 2018 à 11:39
Salut Realness,

Ta source de données n'est pas facile à utiliser. En extraire les mots de façon automatisée va nécessiter beaucoup d'efforts.

Est-ce qu'une autre source de mots de grec moderne pourrait te convenir ?

Si oui, tu pourrais utiliser le fichier Hunspell (correcteur orthographique libre, notamment utilisé sur Libre Office) réalisé pour cette langue :

https://github.com/titoBouzout/Dictionaries

télécharge Greek.dic (sous licence MPL 1.1/GPL 2.0/LGPL 2.1)

c'est un fichier texte, avec 575133 mots.

Comme il pèse 13 Mo, tu peux le charger en mémoire dans ton programme C (après avoir passé la première ligne, qui indique le nombre de mots du fichier), découper le contenu en mémoire en mots avec strtok sur le caractère de retour à la ligne, indexer dans un tableau les adresses mémoire des mots, et utiliser une fonction générant aléatoirement des nombres de 0 à 575132 pour récupérer l'adresse mémoire du mot correspondant.

Pour gérer l'absence de répétition, il suffit d'écraser l'adresse mémoire contenue à l'index utilisé en y mettant NULL, ou, si tu veux réutiliser les données en mémoire dans le cadre du même lancement du programme, gérer une deuxième liste, jetable après tes tirages, des numéros d'index utilisés.

Comme toujours, ce genre de choses est plus facile à faire dans d'autres langages, comme Perl ou Python.

En Perl, cela se fait en quelques lignes :

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

# chargement
open my $handle, '<', "Greek.dic";
chomp(my @words = <$handle>);
close $handle;

# tirage de 10 mots sans répétition
my @list;
my %idx_used;
my $idx;

do {
    do {
        $idx = rand @words;
    } while ($idx == 0 || exists $idx_used{$idx});
    push @list, $words[$idx];
    $idx_used{$idx} = 1;
} while (@list < 10);
print Dumper(@list);

$ ./realness.pl 
$VAR1 = 'πρωιμοθεριζόσασταν';
$VAR2 = 'δραχμοβίωτης';
$VAR3 = 'θεόληπτη';
$VAR4 = 'σαραβαλιασμένων';
$VAR5 = 'δηλούντες';
$VAR6 = 'ασπρίζουμε';
$VAR7 = 'καταστρεφόμαστε';
$VAR8 = 'ξεκρεμαζόντουσαν';
$VAR9 = 'επιπλατινωνόμασταν';
$VAR10 = 'δημοσιονομίες';

Dal
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 19 mars 2018 à 15:07
en C, c'est un peu plus long (mais pas tant que çà en fait), et cela donne :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main(void)
{
	/* check if rand can generate up to 575133 */
	if (RAND_MAX < 575133) {
		printf("RAND_MAX = %d, cannot generate up to 575133\n", RAND_MAX);
		return 1;
	}

	/* open dic file and store it in a buffer */
	FILE * fich = fopen("Greek.dic", "rb");
	fseek(fich, 0, SEEK_END);
	long fsize = ftell(fich);
	fseek(fich, 0, SEEK_SET);
	char * words = malloc(fsize + 1);
	fread(words, fsize, 1, fich);
	fclose(fich);

	/* terminate the buffer with '\0' so we have a valid C string */
	words[fsize] = '\0';

	/* splitting buffer into strings for each word 
	 * and store each word address in an array */
	char * idx[575133];
	unsigned long count = 0;
	char * p;
	p = strtok (words,"\n");
	while (p != NULL) {
		idx[count] = p;
		count++;
		p = strtok (NULL, "\n");
	}

	/* draw 10 words randomly without repetition */
	int ndraws;
	char * draws[10];

	srand(time(NULL));
	
	for (ndraws = 0; ndraws < 10; ndraws++) {
		unsigned long i;
		do {
			i = rand() % 575133;
		} while (idx[i] == NULL);
		draws[ndraws] = idx[i];
		idx[i] = NULL;
	}

	/* display the draws and do whatever with them */
	for (ndraws = 0; ndraws < 10; ndraws++) {
		printf("draw %d = %s\n", ndraws, draws[ndraws]);
	}

	return 0;
}

compilation et exécution :

$ gcc -Wall realness.c 
$ ./a.out
draw 0 = κασάτο
draw 1 = επτασύλλαβου
draw 2 = εκφυλίσει
draw 3 = ταΐστηκα
draw 4 = χαζολογώ
draw 5 = ζάλωσαν
draw 6 = κράτα
draw 7 = στοιβάζουν
draw 8 = καλοζυγιαζόμουν
draw 9 = Έσε
$

Dal
0
Realness Messages postés 33 Date d'inscription lundi 2 octobre 2017 Statut Membre Dernière intervention 26 mars 2018
19 mars 2018 à 20:25
Salut Dal,


Avant tout, je te remercie pour ta réponse super détaillée, les codages que tu y as inclus et également pour le site web https://github.com/titoBouzout/Dictionaries qui représente une mine d’or à mes yeux! Vraiment, merci 1000 fois, je connaissais pas du tout !


Écoute, je veux surtout pas paraître impoli ou perçu comme quelqu’un qui crache dans la soupe, mais une ressource de plus de 550.000 mots pour le grec moderne c’est ingérable...


Le prend surtout pas mal, mais ce que je veux dire, c’est que ta ressource est extrêmement complète, voire trop… Prenons par exemple le mot αγγλικανικός qui est présent dans ta base de données. J’ai seulement besoin de ce mot pour pouvoir le décliner ensuite moi-même dans toutes les formes possibles.


Ce qui se passe avec le fichier que tu m’as communiqué, c’est qu’il mentionne le mot de base mais également TOUTES les déclinaisons possibles et dont je n’ai pas besoin et qui augmentent le volume de données à traiter (αγγλικανικοί, αγγλικανικό, αγγλικανικού…).


Tu es sûr qu’on peut pas faire quelque chose avec ma base de données comme la convertir en fichier texte plus facile à exploiter qu’un pdf? Tu as dit que ça représenterait beaucoup d’efforts, mais je suis prêt à y mettre le temps nécessaire voire même coder en langage autre que le C comme Perl ou Python que tu me recommandes! Car je peux me baser sur ce programme pour d’autres projets à venir!


Alors oui, après ma base de données comporte seulement que 3000 mots, ce qui n’est rien à côté de la tienne qui en représente environ 200 fois plus, mais ce qui est bien avec celle que j’utilise, c’est qu’elle est précise, avec des définitions, des exemples, l’article à utiliser devant le mot (το/η/ο) etc.


J’espère que tu peux comprendre. Merci encore,


Realness
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 20 mars 2018 à 11:48
Pas de problème Realness

Tu es sûr qu’on peut pas faire quelque chose avec ma base de données

Ce que tu as n'est pas une base de données. C'est un fichier PDF, c'est à dire un document informatique conçu pour l'impression et non pour un accès informatique à des données structurées.

comme la convertir en fichier texte plus facile à exploiter qu’un pdf? Tu as dit que ça représenterait beaucoup d’efforts, mais je suis prêt à y mettre le temps

Ton fichier PDF n'est pas chiffré et donc son contenu peut effectivement être extrait dans une certaine mesure, même par copier-coller, ou avec des outils d'extraction comme celui proposé par carol103. Je ne connais pas cet outil particulier, mais j'ai testé quant à moi ton fichier avec l'outil Linux
pdftotext
et avec la fonction d'exportation du lecteur de PDF Okular (qui existe aussi pour Windows).

Okular dispose aussi d'une fonction efficace de sélection de blocs permettant la récupération de colonnes entières sur ton document par copier-coller.

Si tu disposes d'Adobe Acrobat, essaye leurs fonctions d'exportation aussi (non testé je n'en dispose pas sur mon poste actuel).

Ces différents outils ont les problèmes suivants :
- la prononciation phonétique entre crochets n'apparaît pas correctement (certainement un problème de police et/ou d'encodage non UTF-8 pour cette police)
- le document étant en colonnes, selon les outils d'extraction, tu vas avoir : (1) sur une même ligne la lettre d'index apparaissant en marge gauche, suivie d'une partie de la définition présente sur la colonne de gauche, suivie d'une partie de la définition présente sur la colonne de droite (inutilisable) ; ou (2) dans le meilleurs des cas l'outil gérera les colonnes et tu auras des informations consécutives pour chaque colonne de chaque page, séparées par des blancs, des numéros de page ou autres caractères liés à la mise en page à supprimer, ensuite, selon ce que tu veux récupérer pour ton programme, tu devras rectifier les lignes coupées prématurément, les traits d'union quand un mot est coupé car il ne tient pas dans la colonne, etc.

Bref, un travail manuel important à réaliser pour, au final, réaliser ta propre base de données.

Selon ce que tu veux mettre dedans, tu pourras créer un fichier texte, avec une ligne par mot, et des champs séparés par un caractère séparateur ne se trouvant pas dans les définitions (oublie la virgule), par exemple le ; (qui ne semble pas utilisé) et cela pourrait donner cela :

012101;αξίζω
012102;απαγορεύω
012103;απαισιόδοξος, απαισιόδοξη, απαισιόδοξο

et dans ce cas ton programme pourra tirer aléatoirement des mots et indiquer la localisation du mot dans le document, mais pas le reste (tu devras te reporter au document PDF, à la lettre, page et numéro de mot tiré par le programme)

ou :

012101;αξίζω;VB [] 1. cost: Αυτός ο πίνακας αξίζει 6.000 ευρώ. This painting costs 6.000 euros. 2. deserve: Σου αξίζει ένα μεγάλο δώρο για την επιτυχία σου. You deserve a great gift because of your success.
012102;απαγορεύω;VB [] forbid: Η αστυνομία απαγόρευσε την είσοδο στο κτήριο. The police have forbidden entrance to the building.
012103;απαισιόδοξος, απαισιόδοξη, απαισιόδοξο;ADJ [, , ] pessimistic: Μην είσαι τόσο απαισιόδοξος για το μέλλον! Don’t be so pessimistic about the future!

et dans ce cas ton programme pourra tirer aléatoirement des mots, indiquer la localisation du mot dans le document et afficher les autres informations affichables relevant du 3ème champ. Tu peux même découper les champs plus finement.

Un autre point d'attention est que, certainement, pour exploiter ce document de cette façon, tu devrais demander la permission à l'éditeur et/ou aux auteurs. Surtout si tu en fais un usage autre que purement privé.

Si tu demandes gentiment, en expliquant ce que tu veux en faire, ils pourraient même te fournir le document sous une forme plus exploitable.

A ce propos, tu disais :

j’ai également le code source du fichier pdf mais je ne sais vraiment pas par où commencer

Si par "code source" tu veux dire ce que tu vois en ouvrant le fichier PDF avec un éditeur de texte commençant par "%PDF-1.5", tu n'as rien d'autre que le fichier PDF, et rien de plus exploitable.

Selon les propriétés du document PDF, ce document est produit par Adobe InDesign CS5.5. si tu disposes de ce logiciel (coûteux) et du fichier au format Adobe InDesign qui est la source de ce document PDF. Si tu dispose de ces éléments, utilises les (si tu disposes des droits pour ce faire :-).

Bonne chance dans ton projet.

Dal
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 20 mars 2018 à 13:38
Le code de localisation devrait plutôt être du type 0102101, selon la convention que tu veux utiliser, puisque tu as 24 lettres (2 digits) plus d'une centaine de pages (3 digits) et moins de 100 définitions par pages (2 digits)

Au sujet des caractères de phonétique, j'ai trouvé l'origine du problème. Les codes de caractères insérés dans le document PDF pour les représenter sont définis en dehors des plages du standard Unicode.

par exemple le premier caractère phonétique utilisé pour Alpha a un code de caractère U+F061 :

https://codepoints.net/U+F061

et comme dit Wikipedia, cité par cette page au sujet des Private Use Areas :

The code points in these areas can not be considered as standardized characters in Unicode itself. They are intentionally left undefined so that third parties may define their own characters without conflicting with Unicode Consortium assignments.

donc, tu ne peux pas afficher ces caractères correctement sans la police particulière traitant ces codes non standard et un programme capable de l'utiliser (certainement pas un programme console)
0
Utilisateur anonyme
19 mars 2018 à 21:20
Pour convertir du PDF en txt, il y a ça (gratuit et efficace)
https://www.colorpilot.com/products.html
0
Realness Messages postés 33 Date d'inscription lundi 2 octobre 2017 Statut Membre Dernière intervention 26 mars 2018
20 mars 2018 à 20:52
Parfait,


Alors du coup entre-temps j’ai opté pour l’option d’extraire toutes les données du fichier pdf manuellement et de les disposer selon la seconde méthode dont tu parles :


###### ;mot ;catégorie [] 1. Sens + Définition 2. Sens + Définition


J’ai également essayé d’extraire le fichier PDF en format TXT, et j’ai été confronté aux problèmes dont tu parles. Après pour la phonétique ce n’est pas très grave, je connais de base comment lire tout ce charabia donc je peux m’en dispenser.


Comme ça, je suis sûr d’avoir toutes les données que je souhaite dans le bon ordre, comme je veux, et de ne pas tomber sur une coquille plus tard dans le programme.


Je pense que ça devrait prendre entre 3 semaines et 1 mois le temps que je m’y consacre à fond en parallèle de mes études, mais au pire des cas il n’y a pas forcément d’urgence : le mémoire est pour la fin de l’été 2019, et je veux prendre de l’avance pour qu’il soit complet.


D’ailleurs, j’avais deux questions à te poser. Toi et moi avons le même raisonnement de code de localisation que je souhaite inclure dans mon programme : c’est-à-dire 24 lettres (2 digits) plus d'une centaine de pages (3 digits) et moins de 100 définitions par pages (2 digits). Ça nous donne donc 1 ;14 ;1 ou 1141 sans les « ; ».


Étant donné que la coordonnée minimale est de l’ordre de 1141 et la maximale de 2413613, est-ce que, lors de la saisie manuelle des coordonnées en même temp que du fichier pdf dans Word, il est nécessaire que je saisisse 001141 (six chiffres, comme la coordonnée maximale est d’elle-même de six chiffres) ? Ou je peux la laisser en tant que 1141 ? Le programme va-t-il reconnaître la coordonnée quand même ?


D’autre part, le caractère « ; » est utilisé dans la langue moderne grecque, il représente leur « ? » à eux. Par contre, le « * » est utilisé nulle part dans le fichier. Tu penses que c’est jouable d’utiliser « * » au lieu de « ; » comme caractère séparateur? Je veux dire, je veux pas que ça crée des problèmes d’encodage étant donné que « * » peut être considéré comme un caractère spécial et possible qu’il ne soit pas reconnu par la console.


Merci,


Realness
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
20 mars 2018 à 23:30
Pour le "code de localisation", c'est ton idée :-)

c’est-à-dire 24 lettres (2 digits) plus d'une centaine de pages (3 digits) et moins de 100 définitions par pages (2 digits). Ça nous donne donc 1 ;14 ;1 ou 1141 sans les « ; »

non : 0101401

Si tu dois les utiliser groupés, écris toujours en utilisant le même format : les 2 premier chiffres représentent la lettre, les trois suivants la page, les deux derniers la position dans la page (il y en a 7, pas 6, hein...). Sinon, tes identifiants risquent de ne pas être uniques.

Son usage ne me paraît pertinent que si tu veux conserver la possibilité, pour ton programme, de dire exactement où se trouve le mot tiré dans le document PDF de référence, pour le retrouver manuellement plus facilement.

Autrement, cela devient redondant, c'est du travail pour rien, et cela n'apporte rien à ta base. Tu pourrais juste référencer chaque ligne 0, 1, 2, 3, 4, etc. pour distinguer et identifier tes lignes dans ta base et tes tirages seront facilités.

saisie manuelle des coordonnées en même temp que du fichier pdf dans Word

N'utilise pas MS Word pour saisir. C'est un traitement de texte, et il a la fâcheuse tendance de rajouter des caractères que tu ne tapes pas pour te "faciliter la vie". Utilise un éditeur de texte brut, en t'assurant qu'il sauvegarde bien en Unicode.

Ou à la rigueur Excel, en exportant ensuite au format CSV (il mettra les caractères séparateurs des colonnes tout seul).

le caractère « ; » est utilisé dans la langue moderne grecque, il représente leur « ? » à eux. Par contre, le « * » est utilisé nulle part dans le fichier. Tu penses que c’est jouable d’utiliser « * » au lieu de « ; » comme caractère séparateur?

Le but en choisissant la virgule ou le point-virgule est d'employer des caractères couramment utilisés dans le format CSV, ce qui aurait l'avantage de rendre ton fichier lisible par un tableur, ou importable dans un système de gestion de base de données, tout en restant un format facile à exploiter dans un programme simple en C.

On peut même utiliser des virgules (ce qui est le séparateur supposé "normal"), si le champ où se trouve des virgules dans du contenu est entre guillemets (et s'il y a des guillemets dans le contenu, en les doublant).

vois https://en.wikipedia.org/wiki/Comma-separated_values#Example

Tu devrais t'en tenir à la virgule ou au point-virgule pour faciliter la réutilisation directe de ton travail.
0
Realness Messages postés 33 Date d'inscription lundi 2 octobre 2017 Statut Membre Dernière intervention 26 mars 2018
Modifié le 26 mars 2018 à 22:41
Bonsoir à tous, et merci beaucoup pour toutes vos réponses et l’aide apportée !

Dal, en fait, ce que je voudrais, ce serait d’utiliser ce code de localisation comme constante dans l’exemple de programme expliqué par une réponse ci-dessus et dont l’auteur est Whismeril :

« option 2
• une fois pour toute tu transferts tous tes mots dans une base de données (qui peut être un fichier excel, mais aussi un csv, un xml un json, Access, sql ,etc.... )
• chaque mot possède une clé unique qui est la coordonnée.
• chaque mot possède son orthographe
• chaque mot possède sa définition
• chaque mot possède son type (verbe, nom, article etc...)
• chaque mot possède son genre (si ça existe en grec)
• bref chaque mot possède tout ce qui le définit.
• dans ton programme,
• tu tapes la coordonnées
• le programme vérifie qu'elle existe
• si oui écrit dans excel et strocke
• si non message d'erreur
»

Ce programme me conviendrait parfaitement comme base, et je pourrai toujours y apporter des modifications moi-même une fois la programmation d’un langage donné assimilé et/ou vous consulter ici.

En attendant, il y’a eu une évolution dans mon projet, puisque j’ai réussi à extraire le document pdf de base en « texte » (il fallait tout simplement passer par une fonction payante d’Adobe Acrobat qui permet de transposer le fichier pdf en fichier Excel et qui distribue les mots avec définitions verticalement dans les lignes du tableur).

J’ai aussi essayé comme tu l’a dit d’enregistrer le fichier en format CSV (Windows) et ça m’a sorti un autre fichier avec que des « ? » à la place des caractères grecs… Je sais pas du tout si c’est un problème d’encodage ou autre.

De toutes façons, je viens de finir d’apposer les codes de localisation pour la lettre A (Α, α) (0101401 etc.) dans le fichier Excel, donc tu penses que je peux commencer à faire un essai moi-même avec toutes les coordonnées de cette lettre (333) pour voir ce que le programme donne ? Comme une sorte de « premier jet » ? Je sais, je suis pressé !

Parce que même si le document pdf à l’heure qu’il est est devenu un tableur qui s’étale sur plus de 3500 lignes (ce qui m’a beaucoup mâché le boulot dans un sens et toujours plus pratique que de travailler en permanence ses capacités de copiages-collages du fichier pdf à Bloc Notes comme je le faisais avant), il a toujours besoin de corrections manuelles pour les définitions qui ont sautées et qui se retrouvent sur deux lignes (je voulais mettre des images mais ma connexion est laborieuse en ce moment), donc je voudrais pas tout coder pour qu’au final rien ne fonctionne et qu’il faille tout revoir.
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 27 mars 2018 à 14:02
En attendant, il y’a eu une évolution dans mon projet, puisque j’ai réussi à extraire le document pdf de base en « texte » (il fallait tout simplement passer par une fonction payante d’Adobe Acrobat qui permet de transposer le fichier pdf en fichier Excel et qui distribue les mots avec définitions verticalement dans les lignes du tableur).

C'est super si tu disposes d'Abobe Acrobat et cette fonction.

J’ai aussi essayé comme tu l’a dit d’enregistrer le fichier en format CSV (Windows) et ça m’a sorti un autre fichier avec que des « ? » à la place des caractères grecs… Je sais pas du tout si c’est un problème d’encodage ou autre.

Oui, l'encodage doit être Unicode et le visualiseur du fichier Unicode doit être capable de lire l'Unicode.

Sur ma version d'Excel (2010) fonctionnant sous Wine (je suis sous Linux), la sauvegarde en .csv ne me donne pas la possibilité de choisir l'encodage. En revanche, j'ai une option de sauvegarde en texte Unicode, qui produit une exportation correcte en texte brut Unicode séparant les champs par des tabulations (un test avec file dessus donne "Little-endian UTF-16 Unicode text, with CR line terminators").

De toutes façons, je viens de finir d’apposer les codes de localisation pour la lettre A (Α, α) (0101401 etc.) dans le fichier Excel, donc tu penses que je peux commencer à faire un essai moi-même avec toutes les coordonnées de cette lettre (333) pour voir ce que le programme donne ? Comme une sorte de « premier jet » ? Je sais, je suis pressé !

Pourquoi pas, cela te permettra de valider ce que tu veux faire.

Si tu parviens à exporter en texte brut, tu pourras traiter le contenu avec la tabulation (code ASCII 9).

Autrement, Excel dispose aussi de son langage (VBA), et aussi de Ctrl-F :-)


Dal
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 27 mars 2018 à 18:35
Si tu veux le faire en C, tu peux t'inspirer du programme que j'ai proposé dans ce post pour charger en mémoire le contenu du fichier csv et y accéder sous la forme d'un tableau de struct contenant des pointeurs vers les éléments :

https://forums.commentcamarche.net/forum/affich-34387343-string-char-traitement-fichier-csv#15
(exemple simplifié de parsing sur une ligne simulée)
https://forums.commentcamarche.net/forum/affich-34387343-string-char-traitement-fichier-csv#18 (exemple pour une lecture ligne par ligne d'un fichier avec fgets et allocation de mémoire ligne par ligne)

rétrospectivement, je trouve cela un peu compliqué de passer par fgets, et, pour l'allocation mémoire, tu pourrais adapter ce que j'ai proposé plus haut https://forums.commentcamarche.net/forum/affich-35265601-novice-dans-la-programmation#17 pour tout charger en mémoire d'un coup avec fread, utiliser d'abord strtok sur les retours à la ligne pour délimiter les lignes, et pour chaque ligne, utiliser strtok sur la tabulation (ton caractère séparateur) pour délimiter les champs et mettre les pointeurs dans un tableau de struct.

dans ton cas, comme tu connaîtras à l'avance le nombre de mots, tu peux tout de suite dimensionner ton tableau de struct et tout charger d'un coup t'évite de faire plusieurs passes et optimise la mémoire utilisée.

Dal
0