Astuce : reformater une chaîne sur plusieurs lignes (comme une requête SQL par exemple)

by Olivier 10/07/2008 17:38:00

Il arrive souvent qu'on ait besoin de faire un copier-coller d'une chaine de caractères fractionnée en plusieurs lignes. Qu'il s'agisse d'un bout de texte avec des retours à la ligne ou bien par exemple une requête SQL, s'il y a beaucoup de lignes la mise en forme est fastidieuse. Il faut indenter chaque ligne, mettre des guillemets au début et à la fin, ajouter un "+" à chaque ligne... C'est vraiment le genre de chose qui coupe l'élan en plein milieu du codage d'une méthode.

Mais il existe une solution simple, très simple même, qui fait intervenir le chercher/remplacer de Visual Studio avec deux mini expressions régulières, tellement petites que même si vous êtes réfractaire aux ER je suis sûr que celles là vous les noterez et les utilisez !

Acte 1 : une belle requête

Supposons une requête ni trop petite ni trop grosse, pour notre exemple, par exemple générée par un outil comme MKQB ou un autre VQB :

SELECT
  dbo.INPUTUNIT.BATCH_ID,
  dbo.INPUTUNIT.FOLD_ID,
  dbo.INPUTUNIT.DOCUMENT_ID,
  dbo.INPUTUNIT.SHEET_ID,
  dbo.INPUTUNIT.PAGE_ID,
  dbo.INPUTUNIT.ENTITYID,
  dbo.INPUTUNIT.CREATEDON,
  dbo.INPUTUNIT.CREATEDBY,
  dbo.INPUTUNIT.MODIFIEDON,
  dbo.INPUTUNIT.MODIFIEDBY,
  dbo.INPUTUNIT.LASTERROR,
  dbo.INPUTUNIT.NAME,
  dbo.INPUTUNIT.TYPE,
  dbo.INPUTUNIT.IMAGEID,
  dbo.INPUTUNIT.STATE,
  dbo.INPUTUNIT.REASON,
  dbo.INPUTUNIT.EXPIRYDATE,
  dbo.INPUTUNIT.POSITION,
  dbo.INPUTUNIT.PRIORITY,
  dbo.INPUTUNIT.COMMINGFROMSTEP,
  dbo.INPUTUNIT.NEXTWORKFLOWSTEP,
  dbo.INPUTUNIT.CURRENTVALUE,
  dbo.INPUTUNIT.REGEXPRESSION,
  dbo.INPUTUNIT.NULLALLOWED,
  dbo.INPUTUNIT.CHECKMINMAX,
  dbo.INPUTUNIT.MINVALUE,
  dbo.INPUTUNIT.MAXVALUE,
  dbo.INPUTUNIT.VALUELIST,
  dbo.INPUTUNIT.MULTIVALUE,
  dbo.INPUTUNIT.STRICTVALUELIST,
  dbo.INPUTUNIT.CROPZONE,
  dbo.INPUTUNIT.INPUTCOUNT,
  dbo.INPUTUNIT.CONFIDENCEINDEX,
  dbo.INPUTUNIT.FORMAT,
  dbo.INPUTUNIT.DATATYPE,
  dbo.INPUTUNIT.DECIMALDIGITS,
  dbo.INPUTUNIT.MONEYFACTOR,
  dbo.INPUTUNIT.CASING,
  dbo.INPUTUNIT.CHECKLENGTH,
  dbo.INPUTUNIT.MAXLENGTH,
  dbo.INPUTUNIT.MINLENGTH,
  dbo.INPUTUNIT.MINSECURITYLEVEL,
  dbo.INPUTUNIT.CHECKDLL,
  dbo.INPUTUNIT.DLLCHECKNUMBER,
  dbo.INPUTUNIT.COMMENT
FROM
  dbo.INPUTUNIT
  INNER JOIN dbo.FOLD ON (dbo.INPUTUNIT.FOLD_ID = dbo.FOLD.ENTITYID)
  INNER JOIN dbo.BATCH ON (dbo.INPUTUNIT.BATCH_ID = dbo.BATCH.ENTITYID)
WHERE
  (dbo.FOLD.FOLDTYPE = 0) AND
  (dbo.BATCH.CUSTOMERID LIKE '%') AND
  (dbo.BATCH.BUSINESSID LIKE '%') AND
  ((dbo.INPUTUNIT.STATE = 5) OR
  (dbo.INPUTUNIT.STATE = 6))
 

C'est une requête somme toute très classique (et réelle, prise au hasard d'une appli en cours). Mais voilà, elle est sur "plein de lignes", elle est indentée avec des espaces au début, il va falloir jongler au clavier pour supprimer les espaces, placer les guillemets au début et à la fin et un petit signe + pour finir...
Nous commençons par coller cette requête dans le corps d'une méthode. je vous fait grace de la capture écran, on trouve une méthode "machin" ses accolades de début et de fin et ... notre belle requête en plein milieu comme un cheveu sur la soupe de C#.

Acte 2 : Désindenter

Pour ça, c'est facile, mais peut-être ne connaissez-vous l'astuce : sélectionnez tout le bloc texte en question, et tapez autant de fois que nécessaire la combinaison SHIFT-TAB jusqu'à ce que toutes les lignes se retrouvent collées à gauche. C'est un bon début et c'est rapide à faire.

Acte 3 : Chercher - Remplacer

Le plus gros de l'effort a été fait, et nous n'avons pas fait grand chose pour le moment...
Vérifiez que le texte est toujours sélectionné puis ouvrez la boîte de dialogue Chercher/Remplacer (CTRL-H) et renseignez les champs comme le montre cette capture écran :

 

Le texte à chercher est {.+} et le texte de remplacement est +"\1 ", cochez "Use " puis "Regular expression" (Utiliser/Expressions régulières pour la version FR). Puis cliquez sur "Replace All" (Remplacer tout). Vous noterez l'espace après le "1", c'est au choix, il ajoute un espace à chaque ligne avant de mettre le guillement fermant, pour une requête SQL c'est putôt préférable, dans d'autres circonstances cela peut gêner ou bien être remplacé par un autre symbole.

Et voici le résultat (du à la mise en page la requête est indentée sous la méthode, en réalité elle reste collée à gauche) :

static void Main(string[] args)
{
+
"SELECT "
+
"dbo.INPUTUNIT.BATCH_ID, "
+
"dbo.INPUTUNIT.FOLD_ID, "
+
"dbo.INPUTUNIT.DOCUMENT_ID, "
+
"dbo.INPUTUNIT.SHEET_ID, "
+
"dbo.INPUTUNIT.PAGE_ID, "
+
"dbo.INPUTUNIT.ENTITYID, "
+
"dbo.INPUTUNIT.CREATEDON, "
+
"dbo.INPUTUNIT.CREATEDBY, "
+
"dbo.INPUTUNIT.MODIFIEDON, "
+
"dbo.INPUTUNIT.MODIFIEDBY, "
+
"dbo.INPUTUNIT.LASTERROR, "
+
"dbo.INPUTUNIT.NAME, "
+
"dbo.INPUTUNIT.TYPE, "
+
"dbo.INPUTUNIT.IMAGEID, "
+
"dbo.INPUTUNIT.STATE, "
+
"dbo.INPUTUNIT.REASON, "
+
"dbo.INPUTUNIT.EXPIRYDATE, "
+
"dbo.INPUTUNIT.POSITION, "
+
"dbo.INPUTUNIT.PRIORITY, "
+
"dbo.INPUTUNIT.COMMINGFROMSTEP, "
+
"dbo.INPUTUNIT.NEXTWORKFLOWSTEP, "
+
"dbo.INPUTUNIT.CURRENTVALUE, "
+
"dbo.INPUTUNIT.REGEXPRESSION, "
+
"dbo.INPUTUNIT.NULLALLOWED, "
+
"dbo.INPUTUNIT.CHECKMINMAX, "
+
"dbo.INPUTUNIT.MINVALUE, "
+
"dbo.INPUTUNIT.MAXVALUE, "
+
"dbo.INPUTUNIT.VALUELIST, "
+
"dbo.INPUTUNIT.MULTIVALUE, "
+
"dbo.INPUTUNIT.STRICTVALUELIST, "
+
"dbo.INPUTUNIT.CROPZONE, "
+
"dbo.INPUTUNIT.INPUTCOUNT, "
+
"dbo.INPUTUNIT.CONFIDENCEINDEX, "
+
"dbo.INPUTUNIT.FORMAT, "
+
"dbo.INPUTUNIT.DATATYPE, "
+
"dbo.INPUTUNIT.DECIMALDIGITS, "
+
"dbo.INPUTUNIT.MONEYFACTOR, "
+
"dbo.INPUTUNIT.CASING, "
+
"dbo.INPUTUNIT.CHECKLENGTH, "
+
"dbo.INPUTUNIT.MAXLENGTH, "
+
"dbo.INPUTUNIT.MINLENGTH, "
+
"dbo.INPUTUNIT.MINSECURITYLEVEL, "
+
"dbo.INPUTUNIT.CHECKDLL, "
+
"dbo.INPUTUNIT.DLLCHECKNUMBER, "
+
"dbo.INPUTUNIT.COMMENT "
+
"FROM "
+
"dbo.INPUTUNIT "
+
"INNER JOIN dbo.FOLD ON (dbo.INPUTUNIT.FOLD_ID = dbo.FOLD.ENTITYID) "
+
"INNER JOIN dbo.BATCH ON (dbo.INPUTUNIT.BATCH_ID = dbo.BATCH.ENTITYID) "
+
"WHERE "
+
"(dbo.FOLD.FOLDTYPE = 0) AND "
+
"(dbo.BATCH.CUSTOMERID LIKE '%') AND "
+
"(dbo.BATCH.BUSINESSID LIKE '%') AND "
+
"((dbo.INPUTUNIT.STATE = 5) OR "
+
"(dbo.INPUTUNIT.STATE = 6)) "
}

Il n'y a plus qu'à se placer au début de la chaîne et de taper "var machaine = " puis de se placer en fin de la dernière ligne de la chaîne, de taper ";" et hop! c'est tout fini tout beau, remis en page et sans risque d'oubli ou de fausse manip ! Là aussi je vous fait grace de la capture écran, vous imaginez facilement le résultat, et puis, profitez-en pour tout de suite refaire la manip histoire de la mémoriser !

Conclusion

Une astuce simple qui rend un grand service et une preuve de plus que pour rébarbatives et contre-intuitives que soient les expressions régulières, savoir s'en servir est toujours un gros avantage...

Bon dev.. et Stay Tuned !

 

Billets liés

Commentaires

13/07/2008 00:27:56

Cyril

Bonjour, pourquoi ne pas utiliser le caractère @ ?

String sql = @"
SELECT
dbo.INPUTUNIT.BATCH_ID,
dbo.INPUTUNIT.FOLD_ID,
dbo.INPUTUNIT.DOCUMENT_ID,
dbo.INPUTUNIT.SHEET_ID,
dbo.INPUTUNIT.PAGE_ID,
dbo.INPUTUNIT.ENTITYID,
dbo.INPUTUNIT.CREATEDON,
dbo.INPUTUNIT.CREATEDBY,
...
";

Cyril fr

13/07/2008 20:39:25

Olivier

Bonne question Smile En fait il n'y a pas de "meilleure" façon chacun utilise la méthode qu'il préfère. Concernant le caractère @ pour ma part je trouve que cela oblige à coller le texte à gauche donc à détruire l'alignement avec le reste du code, sauf à ajouter des espaces inutiles qui se trouveront, hélas, dans la chaîne finale. @ est ainsi très utile pour une constante de type nom de fichier tenant sur une ligne, pour le multiline, c'est esthétiquement que cela me dérange. Mais c'est forcément subjectif...

Olivier fr

Ajouter un commentaire


(Affichera votre icône Gravatar)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]



Aperçu immédiat

28/08/2008 15:38:06

Powered by BlogEngine.NET 1.3.0.0
Theme by Mads Kristensen

L'auteur

Oliver Olivier
Dirigeant de e-naxos, Auditeur, Conseil, Formateur.
Concepteur de MK Query Builder et DataGen.

Email Envoyer un message à Olivier

Calendrier

<<  août 2008  >>
lumamejevesadi
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

Voir le grand calendrier

Avertissement

Les commentaires sont modérés a posteriori et n'engagent en rien la responsabilité de Dot.Blog.
Si un commnentaire vous semble choquant ou contraire aux lois, merci d'en avertir le webmaster qui le supprimera immédiatement.

© Copyright OD 2008

Sign in