Regex reg = new Regex("\".*,.*\"");
string a = "lala\"test, ceci est un test\" lala";
a= reg.Replace(a, "\".*[a].*\"");
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);
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)
(,?"([^"]+(\r\n)*)+",?)|,
(?(,"([^"]+(\r\n)*)+"),"([^"]+(\r\n)*)+",?|,)
public static string[] ChargeCSV(string Ligne) { return Regex.Split(Ligne, "(?(,\"([^\"]+(\\r\\n)*)+\"),\"([^\"]+(\\r\\n)*)+\",?|,)").Distinct().ToArray(); }
Sor,,"Jean,Edouard",01/01/2000,,"houlà y'a plein, plein de choses à dire, et
sur plusieurs lignes, ben oui
il faut bien, hein?"
/// <summary> /// Trouvé sur http://stackoverflow.com/questions/489258/linqs-distinct-on-a-particular-property /// </summary> static class Extension { public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { HashSet<TKey> seenKeys = new HashSet<TKey>(); foreach (TSource element in source) { if (seenKeys.Add(keySelector(element))) { yield return element; } } } } public class TexteIndexe { public string Texte { get; set; } public int Index { get; set; } public static string[] ChargeCSV(string Ligne) { IEnumerable<string> split = Regex.Split(Ligne, "(?(,\"([^\"]+(\\r\\n)*)+\"),\"([^\"]+(\\r\\n)*)+\",?|,)"); IEnumerable<TexteIndexe> splitIndexe = split.Select((t, i) => new TexteIndexe { Texte = t, Index = i }); IEnumerable<TexteIndexe> texteSansDoublonEtPasVide = splitIndexe.Where(x => !string.IsNullOrWhiteSpace(x.Texte)).DistinctBy(x => x.Texte); IEnumerable<TexteIndexe> texteVide = splitIndexe.Where(x => string.IsNullOrWhiteSpace(x.Texte)); string[] resultat = texteSansDoublonEtPasVide.Concat(texteVide).OrderBy(x => x.Index).Select(x => x.Texte).ToArray(); return resultat; } }
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
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.