String Replace avec condition

edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 - 5 févr. 2016 à 20:46
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 - 11 févr. 2016 à 07:04
Bonjour,
La question est en fait très simple mais je trouve pas de solution.

Je souhaite transformer une chaine de caractère tel que "test, test" en "test.test".

En gros, si la virgule se trouve entre deux guillemets, je souhaite changer cette virgule en un point !

Pour la regex, j'ai trouvé ceci \"[A-Z a-z 0-9]+,[A-z a-z 0-9]+\" mais je ne trouve pas de solution pour remplacer juste la virgule !

Merci
A voir également:

3 réponses

Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
6 févr. 2016 à 07:10
Sur l'exemple de dot net perls, assez bas dans la page il montre une solutions avec un délégué. C'est ça qu'il faut faire.
1
edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 2
6 févr. 2016 à 08:24
Merci bcp !!!
0
edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 2
6 févr. 2016 à 08:26
Voilà la solution si jamais:
public static string ComaToDot(string s)
{
return Regex.Replace(s, "\".*,.*\"", delegate (Match match)
{
string v = match.ToString();
Printer.Print(v);
return v.Replace(',','.');
});
}
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
6 févr. 2016 à 11:24
Marque le sujet résolu.
0
edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 2 > Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024
6 févr. 2016 à 13:28
En réalité, le sujet est résolu, mais je pense pas avoir posé la bonne question de départ car mon problème est autre. Mon réel problème est que je lis un fichier csv avec séparateur la virgule. Malheureusement, dans des champs Commentaires, certaines personnes ont également placé des virgules mais le contenu de ces champs sont entre guillemets.
Comment faire dès lors pour split uniquement qd la virgule ne se trouve pas entre guillemet ? (Utiliser regex.split mais avec quelle regex? une regex conditionnelle ?)
Merci
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656 > edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016
6 févr. 2016 à 18:59
Ça mériterais l'ouverture d'un autre sujet.
En général un csv c'est assez figé, toujours les mêmes colonnes dans le même ordre, si c'est le cas, il suffit de faire la différence entre le nombre de données attendues après le split et ceux obtenus, tu "rejoin" celles en trop.
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
5 févr. 2016 à 22:24
Bonsoir, il faut faire le replace de la Regex, pas celui de string.

http://www.dotnetperls.com/regex-replace
https://msdn.microsoft.com/fr-fr/library/ewy2t5e0(v=vs.110).aspx
0
edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 2
Modifié par edwinzap le 6/02/2016 à 00:58
Oui, je m'étais renseigné à ce niveau. Mais je n'arrive tjrs pas.
Voici ce que j'ai fais
Regex reg = new Regex("\".*,.*\"");
string a = "lala\"test, ceci est un test\" lala";
a= reg.Replace(a, "\".*[a].*\"");


La regex est juste mais le Replace incorrecte. Je le sais mais ne sais pas comment faire autrement...
0
edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 2
Modifié par edwinzap le 6/02/2016 à 01:11
J'ai finalement trouvé ceci, mais je ne crois pas que ça soit la meilleure façon (d'autant que ce test ne fonctionne uniquement s'il y a qu'un seul match)
Regex reg = new Regex("\".*,.*\"");
string a = "lala\"test, ceci est un test\" lala";
MatchCollection mc = reg.Matches(a);
string b = mc[0].ToString();
b = b.Replace(',', '.');
a = reg.Replace(a, b);
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
10 févr. 2016 à 14:23
Bonjour

en tenant compte de ceci

Oui ça fonctionne mais je ne suis pas vraiment satisfait. Juste pour pouvoir splitter correctement, je dois changer les virgules en un autre caractère puis faire le chemin inverse après avoir splitter. Ça me semble un peu ridicule mais c'est la seule solution que j'ai trouvée pour l'instant (grâce à ton aide)


et de la discussion que tu as ouvert ce matin sur les regex.

As tu lu ce message?
http://codes-sources.commentcamarche.net/forum/affich-10060139-string-replace-avec-condition#9

Une autre option est de faire une regex sur la ligne entière, avec des groupes pour ne sortir que ce qui t'interresse. Pour pourvoir te proposer quelque chose, il faut un exemple de ligne (tant qu'à faire celle qui pose le plus de problème)


0
edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 2
10 févr. 2016 à 14:58
Le problème c'est que je ne peux pas mettre ici un exemple réel puisqu'il s'agit de données privées.

Mais le format des lignes est simple, chaque donnée est séparée par une virgule. S'il s'agit de données contenant une virgule (comme les commentaires), ces données sont entourées de virgules. Le champ commentaire peut contenir des retour chariot.

J'ai déjà fait un split pour récupérer chaque ligne (donc chaque enregistrement). Le split posant problème est celui pour récupérer chaque donnée (en considérant comme une seule et unique donnée un commentaire pouvant contenir comme je l'ai dis plus haut, des virgules et des retour chariots)

Ex:

UnNom, UnPrénom, 01/01/2000,"ceci, est un champ commentaire.
ce champ continue ici
mais aussi ici, sur plusieurs lignes !"


je veux récupérer:

Nom = UnNom
Prénom = UnPrénom
DateDeNaissance= 01/01/2000
Commentaire =
ceci, est un champ commentaire.
ce champ continue ici
mais aussi ici, sur plusieurs lignes.

Merci
(et oui en effet, les 3 posts différents tente de résoudre ce même problème. Je devrais peut-être exposé mon problème complet la prochaine fois, désolé)
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656 > edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016
Modifié par Whismeril le 10/02/2016 à 15:35
Donc comme je le disais dans mon commentaire du 6, tu sais combien tu attends de données et dans quel ordre.
Tu splites, tu prends les 3 premiers pour en faire un nom, un prénom (si on est bien d'accord qu'il n'y a pas de virgules entre n prénoms) et une date de naissance, ensuite tu joins ce qui reste.

Ou alors une regex avec des groupes:
(?<nom>\w+),(<prenom>\w+),(?<datenaiss>\d\d/\d\d/\d\d\d\d\d),"(?<commentaire>.*(\r\n)*)"
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656 > Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024
10 févr. 2016 à 15:37
Et s'il peut y avoir des virgules dans le prénom, la regex est modifiable
0
edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 2
10 févr. 2016 à 15:41
Justement non, l'ordre peut changer, et le nombre de colonnes aussi (en fonction de l'ancienneté du fichier css car des données ont été rajoutées par la suite). Je ne peux donc me fier uniquement au nom de la colonne (qui lui aussi peut varier mais la colonne nom contiendra tjrs "nom", la colonne commentaire "commentaire",... Mais d'un fichier à l'autre, la colonne commentaire peut prendre le nom de "remarques ou commentaires" ou simplement "commentaire")
De plus, la colonne commentaire ne se trouve pas forcément à la fin et parfois certaines autres colonnes contiennent également une virgule

Mon programme prend donc la première ligne de fichier (celle avec les noms de colonnes) puis indique le numéro de colonne en fonction de la donnée. Ex: nom=1, prénom=2, commentaire=3 mais dans un autre fichier je pourrais avoir nom=1, prénom=3, commentaire=2 !

C'est pourquoi je souhaite simplement faire un split mais que le split ne divise pas un champ s'il est entre guillemet.

(Si ce n'est vraiment pas possible, je retournerai au système de remplacement puis chemin inverse une fois splitter. Mais je suis étonné d'avoir pu remplacer correctement mais que je puisse pas splitter (qui en soit est juste la recherche inverse))

Voilà j'espère avoir été plus clair
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
10 févr. 2016 à 15:43
d'ou l'interet de bien définir le besoin.....
J'ai pas VS sous la main, j'y réfléchis ce soir.
0
Rejoignez-nous