Oui ;)
Dans le cas du CSV, où une valeur peut être encadrée ou non de guillemets, le split n'est pas adapté car les "séparateurs" ne sont pas indépendants les uns des autres.
Je te propose d'identifier par une expression régulière non pas les
séparateurs, mais plutôt les
valeurs.
Exemple:
Code:
1 2 3 4 5 6 7
| String regex = "(^|(?<=;))([^\";])*((?=;)|$)|((?<=^\")|(?<=;\"))([^\"]|\"\")*((?=\";)|(?=\"$))";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(";\"\";aaaaa;;bb\"bb;\"ccccc\";\"ddd;dd\";ee\"\"ee;\"ff\"\"ff\"");
while (m.find())
{
System.out.println(">>>"+m.group()+"<<<");
} |
affiche
[EDIT] désolé, en relisant je me suis aperçu que la réponse était contenue dans ton post.
Merci.
Décomposition de la regex:
Une valeur non encadrée par des délimiteurs doit:
- soit être en début de chaîne, soit être précédée d'un séparateur: (^|(?<=; ))
- être composée d'une suite de caractère qui ne sont ni le délimiteur ni le séparateur : ([^\";])*
- soit être en fin de chaîne, soit être suivie d'un séparateur : ((?=; )|$)
Une valeur encadrée par des délimiteurs doit:
- soit être en début de chaîne et précédée d'un délimiteur, soit être précédée d'un séparateur et d'un délimiteur : ((?<=^\")|(?<=;\"))
- être composée d'une suite de caractères qui peuvent être un double délimiteur ou un séparateur : ([^\"]|\"\")*
- soit être en fin de chaîne et suivie d'un délimiteur, soit être suivie d'un délimiteur et d'un séparateur : ((?=\"; )|(?=\"$))
[EDIT] grrrr, à chaque fois je mets un quart d'heure à rédiger mon message, et deux autres sont apparus entre temps :aie: