Ajouter un commentaire

fredericmazue

Salut,

Ayant eu 5 minutes, j'ai repris le code de Niroken avec une approche un peu différente pour varier les plaisirs. Au lieu de splitter NOT NULL et de le reconstituer après, on le cherche dans la chaîne en amont. S'il y est on splite la chaîne avec NOT NULL comme critère de séparation puis on splitte les deux parties obtenues avec " " comme critère de séparation puis on regroupe le tout. S'il n'y a pas NOT NULL on splitte avec " " normalement.
J'ai aussi ajouté la suppression de la virgule finale dans les lignes d'attributs et je parcoure le fichier une seule fois au lieu de deux. En outre mon code a une caractéristique qui peut être vue comme un avantage ou un inconvénient (Ca c'est un test pour voir s'il y en a qui suivent)
Voici le code donc:

(defun parse-sql-file (file)
  (with-open-file (stream file)
    (loop for line = (read-line stream nil 'eof)
	  until (eq line 'eof)
	  append (parse-sql-line (string-trim " " line)))))
    
(defun parse-sql-line (line)
  (let ((header-table "CREATE TABLE ")
	(pos-header nil)
	(is-attribute nil)
	(result))
    (setf pos-header (search header-table line))
    (if ( > (length line) 0)
	(setf is-attribute (eq (char line 0) #\`)))
    (if (not (eq pos-header nil))
	(push (build-table-name line header-table) result))
    (if (not (eq is-attribute nil))
	(push (parse-attribute line) result))
  (reverse result)))

(defun build-table-name (line header-table)
   (format nil "Nom de la table: ~A"
 	  (car (cl-utilities:split-sequence #\space (remove #\` (subseq line (length header-table)))))))

(defun parse-attribute (line)
    (let* ((double-token " NOT NULL")
	   (before (search double-token line))
	 (after)
	 (result))
      (if (numberp before)
	  (progn
	    (setf after (length double-token))
	    (setf result (cl-utilities:split-sequence #\space line :start 0 :end before))
	    (setf result (append result (list double-token)))
	    (setf result (append result (cl-utilities:split-sequence #\space (remove #\, line) :start after))))
	  (setf result (append result (cl-utilities:split-sequence #\space (remove #\, line)))))  
    result))

(dolist (x (parse-sql-file "fichier.sql")) (format t "~A~%" x))

et la sortie produite est:


Nom de la table: Enseignant
(`num` int(11)  NOT NULL (11) NOT NULL auto_increment)
(`nom` varchar(20)  NOT NULL char(20) NOT NULL default '')
(`prenom` varchar(20)  NOT NULL varchar(20) NOT NULL default '')
(`mail` varchar(30) default NULL)
(`codeCat` varchar(5)  NOT NULL  varchar(5) NOT NULL default '0')

Oui je sais... j'ai un peu changé la syntaxe générale aussi. Je n'ai pas pu m'en empêcher. :lol:

Filtered HTML

Plain text

CAPTCHA
Cette question permet de vérifier que vous n'êtes pas un robot spammeur :-)
 III  EEEE  III  Y   Y   SSS  
I E I Y Y S
I EEE I Y SSS
I E I Y S
III EEEE III Y SSSS