Et la suite
Bonjour Marin,
Quand tu dis 'essayé' veux tu dire que ça n'a pas marché ???pour la fin des chaines, j'ai essayé de mettre un 'or' car certaines chaines se termine par :
#32 + 'BAR';
#32 + 'RPM';
#32 + 'KW';
et 7 se termine par rien.
Si ça n'a pas marché c'est peut-être que tu n'as pas copié dans 'Reste' la partie de 'sc' qui se situe après #32 + 'BAR'.
Quand tu dis "et 7 se termine par rien" : ça je ne comprends pas. C'est quoi ce 7 ???
Dommage, car il est toujours préférable de résoudre les problèmes à leur source.En amont, on ne peux rien faire.
OK, je vais y jeter un coup d'œil pour voir ce qu'on peut en tirer.Par contre pour que tu y voit plus clair : c'est une centrale d'alarme CMR ... Je te joint une impression clair de l’ensemble qui se ...
OK, il faudra analyser la partie bordel pour voir ce qu'on peut en faire.NUMERO LIBELLE SEUILS ETAT MESURE UNITE
Les NUMERO, LIBELLE et UNITE sont fixes,
Les SEUILS, ETAT et MESURE varient.
Nous le bordel s’applique en la fin du LIBELLE et le SEUILS.
Sur ce, je vais ajouter les or #32 + 'BAR'; or #32 + 'RPM'; or #32 + 'KW';
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Re-salut,
Voici le code modifié qui tient compte des séquences qui se terminent #32 + 'BAR', #32 + 'RPM', ou #32 + 'KW'
... en attendant de savoir ce que tu as voulu dire par "et 7 se termine par rien" :
Attention, dans mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 procedure TForm1.Button1Click(Sender: TObject); var S, Sc, Reste: string; i, poCas1, poCas2, poDeg, poBAR, poRPM, poKW: integer; SL: tStringList; procedure ReduireEspacesA1(var S: string); // Réduit les répétitions d'espaces à un seul var po: integer; begin po := pos(#32#32, S); while po > 0 do begin Delete(S, po, 1); po := pos(#32#32, S); end; end; begin SL := tStringList.Create; SL.Sorted := True; // Liste triée pour regrouper les lignes qui se ressemblent SL.Duplicates := dupAccept; // := dupIgnore si on veut ignorer les doublons Sc := ''; RE1.Lines.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Journal périodique Orig.txt'); for i := 0 to RE1.Lines.count - 1 do begin S := RE1.Lines[i]; Sc := Sc + S; // Accumulation dans Sc de tout ce qui concerne le même enregistrement poCas1 := 0; poBAR := pos(#32 + 'BAR', Sc); if (poBAR > 0) then poCas1 := poBAR; poRPM := pos(#32 + 'RPM', Sc); if (poRPM > 0) then poCas1 := poRPM; poCas2 := 0; poDeg := pos(#32 + '°C', Sc); if (poDeg > 0) then poCas2 := poDeg; poKW := pos(#32 + 'KW', Sc); if (poKW > 0) then poCas2 := poKW; if poCas1 > 0 then begin // Fin de ce qui concerne le même enregistrement Cas 1 Reste := Copy(sc, poCas1 + 4, MaxInt); sc := Copy(sc, 1, poCas1 + 3); ReduireEspacesA1(sc); SL.Add(Sc); // on récupère Sc dans la stringList sc := Reste; end else if poCas2 > 0 then begin // Fin de ce qui concerne le même enregistrement Cas 2 Reste := Copy(sc, poCas2 + 3, MaxInt); sc := Copy(sc, 1, poCas2 + 2); ReduireEspacesA1(sc); SL.Add(Sc); // on récupère Sc dans la stringList sc := Reste; end; end; SL.SaveToFile(repAppli+'Journal_Classé.txt'); RE1.Lines.Assign(SL); // on affiche le résultat dans le même RichEdit SL.Free; end;
1) RE1 c'est le RichEdit qui peut être vide au départ et j'y charge le fichier Journal périodique Orig.txt qui n'est rien d'autre que ton .doc sauvé au format .txt
2) SL.Sorted:=True; afin que la StringList-ramasse-miettes soit triée pour regrouper les lignes qui se ressemblent : ça permet de se rendre plus facilement compte du nombre de cas de figure qu'il faudra décrypter.
3) le SL.SaveToFile(repAppli+'Journal_Classé.txt') vers la fin, tu peux le virer si tu ne veux pas sauver le résultat sur disque.
Ci-joint le fichier-résultat :
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Bonjour Gilbert, en fait les 7 sont : les phrases qui n'ont pas de valeurs d'unité (°C, BAR, KW...)
2-06-3-01 CAP DU NAVIRE
OK 88.3
2-06-3-02 ANGLE DE BARRE BD
OK -3.8
2-06-3-03 ANGLE DE BARRE TD
OK 0.3
2-06-3-04 PAS DEMANDES TD
OK 6.7
2-06-3-05 PAS OBTENUS TD
OK 7.5
2-06-3-06 PAS DEMANDES BD
OK 7.3
2-06-3-07 PAS OBTENUS BD
OK 8.1
Re-salut,
Suggestion pour l'étape suivante : Insérer dans chacune des chaînes NUMERO + LIBELLE + SEUILS + ETAT + MESURE + UNITE des séparateurs qui délimitent les sous-chaînes à bordel.
Pour ma part je propose : NUMERO + LIBELLE + Sep1 + SEUILS + Sep2 + ETAT + Sep3 + MESURE + UNITE, sauf si tu en veux davantage ???.
Ces séparateurs pourront aussi être utilisés par la suite pour imprimer les sous-chaînes alignées sur des colonnes comme dans tes .pdf.
Reste à choisir les Séparateurs dans la table de caractères parmi ceux qui ne proviennent jamais du port com et ceux qui restent invisibles.
Ceux qui restent invisibles dans un RichEdit, mis à part #13 et #10, sont [#1, #9, #11, #12, #28 à #32, et #160] mais on pourrait aussi choisir des caractères accentués qui n'apparaissent jamais dans le binz qui provient du port com.
Ou bien choisis parmi ceux-ci qui s'affichent dans un RichEdit sans trop gêner :
#91 [
#92 \
#93 ]
#123 {
#124 |
#125 }
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Re-salut,
Oups, je n'avais pas remarqué que pendant que je rédigeais mon message précédent tu as été plus rapide que moi :
OK, ça fait donc 7 cas particuliers à ajouter.Bonjour Gilbert, en fait les 7 sont : les phrases qui n'ont pas de valeurs d'unité (°C, BAR, KW...)
2-06-3-01 CAP DU NAVIRE OK 88.3
...
2-06-3-07 PAS OBTENUS BD OK 8.1 [/B]
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Re-salut,
Voici le code modifié pour la prise en compte des 7 cas particuliers qui n'ont pas de valeurs d'unité ... mais qui (bordel en prime) sont des variables :
donc c'est du provisoire qui ne marche qu'avec la longueur des variables que tu as fournies en tant qu'exemples,
et donc seulement si l'ETAT = 'OK' et si la longueur de MESURE ne varie pas : Varie-t-elle ???. : si oui, casse-tête en vue.
Question : comment est libellé l'ETAT lorsqu'il n'est pas 'OK' ???
A+.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 procedure TForm1.Button1Click(Sender: TObject); const cp1 = 'CAP DU NAVIRE'; cp2 = 'ANGLE DE BARRE BD'; cp3 = 'ANGLE DE BARRE TD'; cp4 = 'PAS DEMANDES TD'; cp5 = 'PAS OBTENUS TD'; cp6 = 'PAS DEMANDES BD'; cp7 = 'PAS OBTENUS BD'; var S, Sc, Reste: string; i, poCas1, poCas2, poDeg, poBAR, poRPM, poKW: integer; pocp1, pocp2, pocp3, pocp4, pocp5, pocp6, pocp7: integer; SL: tStringList; procedure ReduireEspacesA1(var S: string); // Réduit les répétitions d'espaces à un seul var po: integer; begin po := pos(#32#32, S); while po > 0 do begin Delete(S, po, 1); po := pos(#32#32, S); end; end; begin SL := tStringList.Create; SL.Sorted := True; // Liste triée pour tenter de regrouper de lignes qui se ressemblent SL.Duplicates := dupAccept; Sc := ''; RE1.Lines.LoadFromFile(RepAppli + 'Journal périodique Orig.txt'); for i := 0 to RE1.Lines.count - 1 do begin //S := trim(RE1.Lines[i]); S := RE1.Lines[i]; Sc := Sc + S; // Accumulation dans Sc de tout ce qui concerne le même enregistrement ReduireEspacesA1(sc); poCas1 := 0; poBAR := pos(#32 + 'BAR', Sc); if (poBAR > 0) and (pos('BARRE', Sc) < 0) then poCas1 := poBAR; poRPM := pos(#32 + 'RPM', Sc); if (poRPM > 0) then poCas1 := poRPM; poCas2 := 0; poDeg := pos(#32 + '°C', Sc); if (poDeg > 0) then poCas2 := poDeg; poKW := pos(#32 + 'KW', Sc); if (poKW > 0) then poCas2 := poKW; pocp1 := pos(cp1, Sc); pocp2 := pos(cp2, Sc); pocp3 := pos(cp3, Sc); pocp4 := pos(cp4, Sc); pocp5 := pos(cp5, Sc); pocp6 := pos(cp6, Sc); pocp7 := pos(cp7, Sc); if poCas1 > 0 then begin // Fin de ce qui concerne le même enregistrement Cas 1 Reste := Copy(sc, poCas1 + 4, MaxInt); sc := Copy(sc, 1, poCas1 + 3); ReduireEspacesA1(sc); SL.Add(Sc); // on récupère Sc dans la stringList sc := Reste; end else if poCas2 > 0 then begin // Fin de ce qui concerne le même enregistrement Cas 2 Reste := Copy(sc, poCas2 + 3, MaxInt); sc := Copy(sc, 1, poCas2 + 2); ReduireEspacesA1(sc); SL.Add(Sc); // on récupère Sc dans la stringList sc := Reste; end else if pocp1 > 0 then begin // 2-06-3-01 CAP DU NAVIRE OK 88.3 Reste := Copy(sc, pocp1 + length(cp1) + 8, MaxInt); sc := Copy(sc, 1, pocp1 + length(cp1) + 7); SL.Add(Sc); sc := Reste; end else if pocp2 > 0 then begin // 2-06-3-02 ANGLE DE BARRE BD OK -3.8 Reste := Copy(sc, pocp2 + length(cp2) + 8, MaxInt); sc := Copy(sc, 1, pocp2 + length(cp2) + 7); SL.Add(Sc); sc := Reste; end else if pocp3 > 0 then begin // 2-06-3-03 ANGLE DE BARRE TD OK 0.3 Reste := Copy(sc, pocp3 + length(cp3) + 7, MaxInt); sc := Copy(sc, 1, pocp3 + length(cp3) + 6); SL.Add(Sc); sc := Reste; end else if pocp4 > 0 then begin // 2-06-3-04 PAS DEMANDES TD OK 6.7 Reste := Copy(sc, pocp4 + length(cp4) + 7, MaxInt); sc := Copy(sc, 1, pocp4 + length(cp4) + 6); SL.Add(Sc); sc := Reste; end else if pocp5 > 0 then begin // 2-06-3-05 PAS OBTENUS TD OK 7.5 Reste := Copy(sc, pocp5 + length(cp5) + 7, MaxInt); sc := Copy(sc, 1, pocp5 + length(cp5) + 6); SL.Add(Sc); sc := Reste; end else if pocp6 > 0 then begin // 2-06-3-06 PAS DEMANDES BD OK 7.3 Reste := Copy(sc, pocp6 + length(cp6) + 7, MaxInt); sc := Copy(sc, 1, pocp6 + length(cp6) + 6); SL.Add(Sc); sc := Reste; end else if pocp7 > 0 then begin // 2-06-3-07 PAS OBTENUS BD OK 8.1 Reste := Copy(sc, pocp7 + length(cp7) + 7, MaxInt); sc := Copy(sc, 1, pocp7 + length(cp7) + 6); SL.Add(Sc); sc := Reste; end end; SL.SaveToFile(repAppli + 'Journal_Classé.txt'); RE1.Lines.Assign(SL); // on affiche le résultat dans le même RichEdit SL.Free; end;
EDIT : Au fait, je n'ai pas pu tester le code en conditions réelles car le .doc dont je dispose n'inclut aucun des 7 cas particuliers.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Re,
Je découvre en même temps, si ce n'est pas OK, cela peut être "BK" ou "TC".
la longueur de MESURE peut varier de 0 à 360 seulement pour le CAP DU NAVIRE
J'ai fait un nouveau test connecté au PC CMR, et voici en PJ ce que cela donne. Par contre lorsque je copie/colle le Journal Périodique lu du port Com sur mon RE1, effectivement il manque des lignes!
Un RichEdit n'a pas de limite de ligne normalement?
Re
Pour les séparateurs, #9 me semble bien
Frédéric
Re,
Voici le résultat pour les 7 cas particuliers :
OK -0.32-06-3-04 PAS DEMANDES TD
OK 278.42-06-3-02 ANGLE DE BARRE BD
OK -5.42-06-3-03 ANGLE DE BARRE TD
OK 6.42-06-3-05 PAS OBTENUS TD
OK 7.02-06-3-07 PAS OBTENUS BD
OK 7.32-06-3-06 PAS DEMANDES BD
2-06-3-01 CAP DU NAVIRE
Bonjour Marin,
OK, l'essentiel est que BK, TC et OK soient toujours de la même longueur (je m'attendais à HS, mais bon).Je découvre en même temps, si ce n'est pas OK, cela peut être "BK" ou "TC".
OK, je vais essayer une combine qui considère que la longueur de mesure peut varier pour les 7 cas particuliers.la longueur de MESURE peut varier de 0 à 360 seulement pour le CAP DU NAVIRE
Il manque des lignes à quel moment ??? Je suppose que c'est lors du 1ier chargement dans le RichEdit car le code qu'on utilise ne supprime que des espaces redondants pour n'en conserver chaque fois qu'un seul.J'ai fait un nouveau test connecté au PC CMR, et voici en PJ ce que cela donne. Par contre lorsque je copie/colle le Journal Périodique lu du port Com sur mon RE1, effectivement il manque des lignes!
Un RichEdit n'a pas de limite de ligne normalement?
Comme JP 10.03.doc ne fait que 201 Ko ça tient largement dans un RichEdit.
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Bonjour Gilbert,
En fait cela me pose pb pour le moment car pour tester en atelier, je fais des copier/coller de ce que j'ai enregistré dans un .doc, mais en fonctionnement normal, l'application recevra directement le contenu sur le port com. Le pb ne devrait plus être.
En faisant des copier/coller .doc vers l'application, sur le .doc, les numéros vont de 1-05-2-01 à 2-06-3-07 alors que dans l'application les numéros vont de 1-05-2-01 à 2-04-4-05 alors que je sélectionne l'ensemble du .doc!!
Frédéric
Re-salut,
A mon avis il serait préférable d'utiliser des séparateurs différents, car pos(#9, Sc) renvoie toujours la position du 1ier séparateurPour les séparateurs, #9 me semble bien
et si on veut imprimer le résultat aligné sur des colonnes comme dans les .pdf ce serait plus facile de pouvoir distinguer directement Position1, Position2, etc
Cela ne correspond plus avec ce que j'ai obtenu en utilisant ton premier Journal périodique.doc converti en .txtVoici le résultat pour les 7 cas particuliers :
OK -0.32-06-3-04 PAS DEMANDES TD
OK 278.42-06-3-02 ANGLE DE BARRE BD
OK -5.42-06-3-03 ANGLE DE BARRE TD
OK 6.42-06-3-05 PAS OBTENUS TD
OK 7.02-06-3-07 PAS OBTENUS BD
OK 7.32-06-3-06 PAS DEMANDES BD
2-06-3-01 CAP DU NAVIRE
Par contre j'obtiens le même résultat à partir de JP 10.03.doc converti en .txt
Il n'est pas normal que le OK soit placé devant NUMERO, LIBELLE ... ni qu'il manque la valeur de MESURE pour le CAP DU NAVIRE : je vais voir d'où ça provient.
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Re-salut,
A propos de "Il n'est pas normal que le OK soit placé devant NUMERO, LIBELLE ... ni qu'il manque la valeur de MESURE pour le CAP DU NAVIRE" :
J'ai trouvé d'où ça provient le OK qui suit CAP DU NAVIRE est situé dans l'une des lignes suivantes : voir capture d'écran de mon Editeur Hexa où les .. (deux points dans la colonne de droite) sont des #13#10
Reste plus qu'à modifier le code en conséquence.
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Bien pratique ton éditeur Hexa
Re-Salut,
A propos de "En faisant des copier/coller .doc vers l'application, sur le .doc, les numéros vont de 1-05-2-01 à 2-06-3-07 alors que dans l'application les numéros vont de 1-05-2-01 à 2-04-4-05 alors que je sélectionne l'ensemble du .doc!!" :
Pour moi, l'essentiel est que le format des numéros soit constant car j'envisage de remanier le code pour repérer les débuts des enregistrements avec ceci :
... et ensuite je ramasse les miettes jusqu'au suivant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 function iDebEnreg(const S: string): boolean; // 1-05-2-02 begin Result := (S[2] = '-') and (S[5] = '-') and (S[7] = '-'); end;
Si tu veux le même, c'est gratuit ici : http://www.01net.com/telecharger/win...es/110455.htmlBien pratique ton éditeur Hexa
HxD Hex Editor
Sur ce je vais continuer le ramasse-miettes.
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Re-salut,
Voici le code du nouveau ramasse-miettes :
... il est nettement plus simple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 procedure TfrmCryDecr.Button1Click(Sender: TObject); var S, Sc, Sd, Sp: string; i, poPage: integer; SL: tStringList; procedure ReduireEspacesA1(var S: string); // Réduit les répétitions d'espaces à un seul var po: integer; begin po := pos(#32#32, S); while po > 0 do begin Delete(S, po, 1); po := pos(#32#32, S); end; end; function iDebEnreg(const S: string): boolean; // Format des NUMEROS = 1-05-2-02 begin Result := False; if S = '' then EXIT; Result := (S[2] = '-') and (S[5] = '-') and (S[7] = '-'); end; begin SL := tStringList.Create; SL.Sorted := False; //RE1.Lines.LoadFromFile(RepAppli + 'Journal périodique Orig.txt'); RE1.Lines.LoadFromFile(RepAppli + 'JP 10.03.txt'); Sc := RE1.Text; ReduireEspacesA1(Sc); RE1.text := Sc; RE1.Update; Sc := ''; i := -1; repeat inc(i); S := RE1.Lines[i]; if S = '' then Continue; if (pos('Opérateur', S) = 2) or (pos('Groupes', S) = 2) or (pos('Page', S) = 2) then begin SL.Add(S); Continue; end else if iDebEnreg(S) then begin repeat Sc := Sc + RE1.Lines[i]; // Accumulation dans Sc de tout ce qui concerne le même enregistrement inc(i); until (i >= RE1.Lines.count - 1) or iDebEnreg(RE1.Lines[i]); poPage := pos('Page', Sc); if poPage > 0 then begin // Lignes formées par un enregistrement + Page 1/6 Opérateur : level 3 Groupes Fonctionnels : RELEVE GENERAL, etc Sd := Copy(Sc, 1, poPage - 1); ReduireEspacesA1(Sd); SL.Add(Sd); Sp := Copy(sc, poPage, MaxInt); ReduireEspacesA1(Sp); SL.Add(Sp); end else begin // Enregistrements courants ReduireEspacesA1(Sc); SL.Add(Sc); end; Sc := ''; dec(i); end; until i >= RE1.Lines.count - 1; SL.SaveToFile(repAppli + 'Journal_NON_Classé.txt'); RE1.Lines.Assign(SL); // on affiche le résultat dans le même RichEdit SL.Free; end;
Par contre pour y insérer des séparateurs ça va être le galère vu la pléthore de LIBELLES qui existent,
sans oublier le problème non résolu du mélange LIBELLE + SEUIL dans par exemple 1-05-2-01 TEMP. ECHAP. APRES H C 4 H 5 A 0 U D I ERE RECUP TD OK 355 °C
Au fait, puisque actuellement les journaux sont imprimés, elle fait comment votre imprimante pour décrypter ce type de charabia ???
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Re,
Le PDF datait du 10/2013, depuis quelques temps, cela ne fonctionne plus! et je ne sais pas comment l'imprimante OKI peut écrire ce charabia..
C'est pas mal maintenant avec ton code, nous sommes très proche!! Plus que le charabia, as tu une idée?
Frédéric
Re,
Pour revenir sur le pb en amont, c'est à dire de l'imprimante, j'ai fouillé dans ses paramètres et elle re-fonctionne a nouveau avec:
Nom :Généric
Pilote : Oki ML 280 Elite (IBM)
port Com 2
Si sa peut d'aider..
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager