supprimer les /r/n dans une chaine

HP Loadrunner
Agnès
Messages : 84
Inscription : jeu. 29 déc. 2011 17:41

supprimer les /r/n dans une chaine

Message : #819 Agnès
lun. 9 déc. 2013 17:12

Bonjour,
comme d'habitude, j'ai un script à faire rapidement

j'ai une très grosse chaine de caractères à modifier

Je récupère dans un param, une chaine avec des /r/n
Exemple
"Corr_ligneComplete" = "CDATA[0000000000001]]></orderProposalLineNumber>\r\n <orderProposalPriceLineNumber><![CDATA[0]]></orderProposalPriceLineNumber>\r\n


Or je dois créer une requête identique mais sans les "espaces et /r/n"
il me semble que l'on peut faire une boucle rapide en C, pour créer une nouvelle chaine sans ces "espaces et /r/n"

Merci de votre aide
Agnès

BlueExp
Messages : 30
Inscription : jeu. 24 nov. 2011 10:44

Re: supprimer les /r/n dans une chaine

Message : #821 BlueExp
mar. 10 déc. 2013 10:21

Bonjour,

Tu peux créer une fonction qui détecte ta chaîne de caractères \r\n et qui va la traiter comme suit :
Ta chaîne peut se noter "A \r\n B" et l'on veut "AB" en sortie :

1/On sauve \r\n plus la chaîne qui suit : résultat : "\r\n B"
2/On sauve la chaîne de départ moins la chaîne précédente : résultat : "A"
3/On recompose la chaîne en concaténant "A" + "\r\n B" décalée de 4 caractères vers la droite : résultat : "AB"

=================================
Pour le code :
//Conversion des chaines de caractères :
// in : abcdefgh\r\n1234

// abcdefgh\r\n1234 = str
// \r\n1234 = c
// abcdefgh\r\n1234 = c-str

// out: abcdefgh1234

char * strchr(char *, char);

int convert_param( char * NomParam)

{
char buf[256];
char *c, str[256];
char NameIn[64], NameOut[64];

sprintf(NameIn, "{%s}", NomParam);
sprintf(NameOut, "%s_conv", NomParam);

sprintf(str,"%s", lr_eval_string(NameIn));
c = strchr(str, '\\r\\n');
if (c== NULL)
lr_save_string(str, NameOut);
else
{

strncpy(buf,str, (c-str));
lr_output_message("str : %s",str);
lr_output_message("c : %s",c);
lr_output_message("c+4 : %s",c+4);
lr_output_message("c-str : %s",buf);
strcat(buf, "");
strcat(buf, (c+4)); //On décale de 4 caractères vers la droite
lr_save_string(buf, NameOut);

}

//Appel de la fonction dans Action :
Action()
{
lr_save_string("abcdefgh\\r\\n1234","toto");
convert_param("toto");
lr_output_message("paramètre de départ : %s",lr_eval_string("{toto}"));
lr_output_message("paramètre converti : %s",lr_eval_string("{toto_conv}"));
return 0;
}

============================
Merci à Vincent au passage, qui m'a inspiré ces lignes.

Agnès
Messages : 84
Inscription : jeu. 29 déc. 2011 17:41

Re: supprimer les /r/n dans une chaine

Message : #822 Agnès
mar. 10 déc. 2013 10:29

Merci ca pourrait le faire, si je n'avais que A r/n et B mais ma chaine complete fait plus de 70 000 caractére avec X fois, le r/n et des espaces.
Il faudrait lire la chaine et chaqur fois qu'il trouve les caractères \r\n et , il faut supprimer


Action.c(276): Notify: Parameter Substitution: parameter "Corr_ligneComplete" = "CDATA[0000000000001]]></orderProposalLineNumber>
\r\n <orderProposalPriceLineNumber><![CDATA[0]]></orderProposalPriceLineNumber>
\r\n <articleCode><![CDATA[17152407]]></articleCode>
\r\n <articleDescription><![CDATA[IDS MOGETTES NATURES 530GR PALETTE]]></articleDescription>
\r\n <articleLVCode><![CDATA[0]]></articleLVCode>
..............................................
Agnès

AdamsVibe
Messages : 16
Inscription : lun. 14 oct. 2013 14:24

Re: supprimer les /r/n dans une chaine

Message : #823 AdamsVibe
mar. 10 déc. 2013 12:07

salut,

//Init
-On fait un malloc de la chaine complete pour l'attribuer à une autre chaine.

//Boucle for
-On parcours la chaine caractere par caractere
-Si caractere == '\r' et Si ensuite caractere == '\n' , on fait avancer l'incrementation sinon on copie le caractere dans la nouvelle chaine crée.
-Si on rencontre le '\0' , on sort de la boucle (break).
//fin boucle

on free le malloc.

Et on peut afficher la chaine pour voir si cela à marcher.

Des que j'ai qq minutes, je teste et je te fais un retour.

Merci.

ielhassnaoui
Messages : 23
Inscription : lun. 15 avr. 2013 12:25

Re: supprimer les /r/n dans une chaine

Message : #824 ielhassnaoui
mar. 10 déc. 2013 12:34

Salut,

Voici une fonction qui j'ai déjà utilisée (développée par une personne il y a quelques années) auparavant pas mal de fois, elle se base sur des malloc comme il a dit AdamsVibe.

//==========================================================================//
char *strReplace(const char *src, const char *from, const char *to)
{
char *value;
char *dst;
char *match;
int size;
int fromlen;
int tolen;

size = strlen(src) + 1;
fromlen = strlen(from);
tolen = strlen(to);

value = (char *)malloc(size);
dst = value;

if ( value != NULL )
{
for ( ;; )
{
match = (char *) strstr(src, from);
if ( match != NULL )
{
size_t count = match - src;
char *temp;
size += tolen - fromlen;
temp = (char *)realloc(value, size);
if ( temp == NULL )
{
free(value);
return NULL;
}
dst = temp + (dst - value);
value = temp;
memmove(dst, src, count);
src += count;
dst += count;
memmove(dst, to, tolen);
src += fromlen;
dst += tolen;
}
else
{
strcpy(dst, src);
break;
}
}
}
return value;
}

int lr_replace( const char *lrparam, char *findstr, char *replacestr )
{
int res = 0;
char *result_str;
char lrp[1024];

sprintf( lrp, "{%s}", lrparam);

result_str = strReplace( lr_eval_string(lrp), findstr, replacestr );

if (result_str != NULL )
{
lr_save_string( result_str, lrparam );
free( result_str );
res = 1;
}
return res;
}

//===============================================================================//

enregistre cette fonction dans un fichier .h et ajoute le path dans globals.h comme ceci :

#ifndef _GLOBALS_H
#define _GLOBALS_H

//--------------------------------------------------------------------
// Include Files
#include "lrun.h"
#include "web_api.h"
#include "lrw_custom_body.h"
#include "===path===\replace.h"

//--------------------------------------------------------------------
// Global Variables

#endif // _GLOBALS_H

//============================Test=======================================//

Puis tu peux l'appeler dans ton script :

Action()
{

lr_save_string("CDATA[0000000000001]]></orderProposalLineNumber>\r\n <orderProposalPriceLineNumber><![CDATA[0]]></orderProposalPriceLineNumber>\r\n <articleCode><![CDATA[17152407]]></articleCode>\r\n <articleDescription><![CDATA[IDS MOGETTES NATURES 530GR PALETTE]]></articleDescription>\r\n <articleLVCode><![CDATA[0]]></articleLVCode>", "MaChaine");

lr_replace("MaChaine", "\r\n", "" );
lr_replace("MaChaine", " ", "" );

// Nouvelle chaine
lr_output_message("%s", lr_eval_string("{MaChaine}"));

return 0;
}

//===============================Résultat====================================//
Résultat :

Action.c(xx): CDATA[0000000000001]]></orderProposalLineNumber><orderProposalPriceLineNumber><![CDATA[0]]></orderProposalPriceLineNumber><articleCode><![CDATA[17152407]]></articleCode><articleDescription><![CDATA[IDSMOGETTESNATURES530GRPALETTE]]></articleDescription><articleLVCode><![CDATA[0]]></articleLVCode>


IEH

Agnès
Messages : 84
Inscription : jeu. 29 déc. 2011 17:41

Re: supprimer les /r/n dans une chaine

Message : #825 Agnès
mar. 10 déc. 2013 14:56

Super Merci
la fonction "fonctionne" bien
je continue mon script

Re Merci

Agnès
Agnès


Revenir vers « HP Loadrunner »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité