par , 09/02/2015 à 18h15 (1482 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. ![:)](https://www.developpez.net/forums/images/smilies/icon_smile.gif)
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.
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).