Voir le flux RSS

Roland Chastain

Fabrication d'un code source en Pascal au moyen d'un script Lua

Noter ce billet
par , 09/02/2015 à 18h15 (1013 Affichages)
Comment fabriquer un code source (dans l'exemple ci-dessous ce sera un code source en Pascal) à partir d'un fichier texte dans lequel se trouvent des données à extraire ?

Si cette problématique (comme disent les professeurs) vous intéresse, nous allons voir comment un script Lua peut effectuer cette tâche.

Pour les besoins d'un exercice sur l'encodage des fichiers, j'avais copié le contenu de cette page et l'avais collé dans un fichier texte.

Le fichier se présente ainsi :

037 IBM037 IBM EBCDIC US-Canada
437 IBM437 OEM United States
500 IBM500 IBM EBCDIC International
...
Dans chaque ligne il y a trois chaînes à extraire : l'identifiant (par exemple "037"), le nom ("IBM037") et l'information complémentaire ("IBM EBCDIC US-Canada"). Comme vous pouvez le remarquer, l'identifiant ne contient que des chiffres ; le nom commence par une lettre ; et l'information complémentaire... se trouve après le nom.

Voici le script Lua qui extrait ces données à l'aide de motifs (si l'on peut traduire ainsi l'anglais pattern). Une fois mis au point le processus d'extraction, la fabrication du code source est un jeu d'enfant.

Code lua : 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
 
-- Script Lua 5.3
-- Extraction des données d'un fichier texte et fabrication d'un code source en
-- Pascal
 
io.input("codepage_identifiers.txt")
io.output("codepage_identifiers.pas")
 
local s = io.read("*a")
 
io.write(
[[
 
(* https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756%28v=vs.85%29.aspx *)
 
unit CodePage_Identifiers;
 
interface
 
type
  TIdentifier = record
    id,
    name,
    info: string;
  end;
 
const
  IDENTIFIERS: array[1..?] of TIdentifier = ( // ligne à corriger manuellement
]]
)
 
for l in string.gmatch(s, "%C+") do
  io.write("    (id: '" .. string.sub(l, string.find(l, "[0-9]+")) .. "'; ")
  local i, j = string.find(l, "[a-zA-Z][%w%-_]+")
  io.write("name: '" .. string.sub(l, i, j) .. "'; ")
  io.write("info: '" .. string.sub(l, j + 2) .. "'),\n")
end
 
io.write(
[[
  );
 
implementation
 
end.
]]
)

Si vous le souhaitez, vous pouvez télécharger l'exemple complet (avec le fichier dont les données sont extraites et le résultat obtenu).

Envoyer le billet « Fabrication d'un code source en Pascal au moyen d'un script Lua » dans le blog Viadeo Envoyer le billet « Fabrication d'un code source en Pascal au moyen d'un script Lua » dans le blog Twitter Envoyer le billet « Fabrication d'un code source en Pascal au moyen d'un script Lua » dans le blog Google Envoyer le billet « Fabrication d'un code source en Pascal au moyen d'un script Lua » dans le blog Facebook Envoyer le billet « Fabrication d'un code source en Pascal au moyen d'un script Lua » dans le blog Digg Envoyer le billet « Fabrication d'un code source en Pascal au moyen d'un script Lua » dans le blog Delicious Envoyer le billet « Fabrication d'un code source en Pascal au moyen d'un script Lua » dans le blog MySpace Envoyer le billet « Fabrication d'un code source en Pascal au moyen d'un script Lua » dans le blog Yahoo

Mis à jour 11/02/2015 à 14h22 par Roland Chastain (remplacé la pièce jointe)

Catégories
Programmation

Commentaires

  1. Avatar de kolodz
    • |
    • permalink
    Je trouve dommageable d'avoir à faire un script LUA pour l'extraction de ces données ! Même si le script en lui même est cool, il faut le reconnaitre

    Sachant qu'à l'origine, on a une table en HTML parfaitement propre !
    Source :https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

    Personnellement, j'ai copié le contenu du tableau, puis collé celui-ci dans notepad++
    Et j'obtiens un fichier propre séparé avec des tabulations. Ce qui aurai rendu la séparation des textes beaucoup plus simple. Un simple "split" sur les tabulations en somme.

    Sinon, il est tout aussi possible de faire l'extraction des données via du JavaScript directement depuis la page en question :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var table = $('#mainSection table');
     
    var rowLength = table.rows.length;
     
    for(var i=0; i<rowLength; i+=1){
      var row = table.rows[i];
        if(row.cells[1].textContent == ''){
          console.log("// Attention cette ligne a un nom vide !");
        }
        console.log("( id: '"+row.cells[0].textContent+"'; name: '"+row.cells[1].textContent+"'; info: '"+row.cells[1].textContent+"'),");
    }
    Le résultat en console est relativement propre :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ( id: 'Identifier'; name: '.NET Name'; info: '.NET Name'),
    ( id: '037'; name: 'IBM037'; info: 'IBM037'),
    ( id: '437'; name: 'IBM437'; info: 'IBM437'),
    ( id: '500'; name: 'IBM500'; info: 'IBM500'),
    ( id: '708'; name: 'ASMO-708'; info: 'ASMO-708'),
    // Attention cette ligne a un nom vide !
    ( id: '709'; name: ''; info: ''),
    // Attention cette ligne a un nom vide !
    ( id: '710'; name: ''; info: ''),
    // ***Output tronqué pour la limite de taille de developpez.com sur les messages***
    Bien sûr cela focus seulement sur la récupération des informations.
    Note : Je me suis permis d'ajouter un commentaire systématique sur les ligne avec un nom vide, car tu as le commentaire "ligne à corriger manuellement", qui me laisse supposé que c'est cette partie que tu va corriger.
    Note² : la flem de gérer le cas de la dernière virgule !

    Après, je me demande ce que utilise comme IDE pour LUA. Car, c'est toujours un peu lourd d'écrire du code sans une peu de d'auto-complétion et de coloration syntaxique.

    Cordialement,
    Patrick Kolodziejczyk.
  2. Avatar de Roland Chastain
    • |
    • permalink
    Merci pour cette réponse fort instructive.

    Effectivement, il aurait été plus simple d'utiliser les tabulations comme séparateurs. J'ai eu le (mauvais) réflexe de les remplacer par des espaces avec la fonction de Notepad++ (ce qui créait une confusion avec les espaces déjà présents).

    Pour les lignes sans nom, je les avais aussi supprimées manuellement dès le début, par facilité, mais il est évident qu'il vaut mieux les conserver. J'aime bien aussi l'idée d'ajouter un avertissement en commentaire. (Le commentaire que j'avais mis, c'était pour la dimension du tableau.)

    Comme éditeur, j'utilise Notepad++. J'en ai installé d'autres (comme ZeroBrane) mais je n'ai jamais pris l'habitude de les utiliser.
    Mis à jour 12/02/2015 à 14h01 par Roland Chastain
  3. Avatar de Roland Chastain
    • |
    • permalink
    Voici une nouvelle version du script, à partir des judicieuses observations de kolodz.

    Code lua : 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
     
    -- Script Lua 5.3
    -- Extraction des données d'un fichier texte et fabrication d'un code source en
    -- Pascal
     
    io.input("CodePageIdentifiers.txt")
    io.output("CodePageIdentifiers.pas")
     
    local s = io.read("*a")
     
    io.write(
    [[
     
    (* https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756%28v=vs.85%29.aspx *)
     
    unit CodePageIdentifiers;
     
    interface
     
    type
      TIdentifier = record
        id,
        name,
        info: string;
      end;
     
    const
      IDENTIFIERS: array[1..152] of TIdentifier = (
    ]]
    )
     
    for ss in string.gmatch(s, "[^\n]+") do
      _, _, id, name, info = string.find(ss, "(%C*)\t(%C*)\t(%C*)")
      if name == "" then
        io.write("    (* Attention, cette ligne a un nom vide ! *)\n")
      end
      io.write("    (id: '" .. id .. "'; name: '" .. name .. "'; info: '" .. info .. "'),\n")
    end
     
    io.write(
    [[
      );
     
    implementation
     
    end.
    ]]
    )

    Le lien dans le premier message a été mis à jour.