Division d’un fichier CSV et exclusion des virgules au sein des éléments

J’ai une chaîne CSV que je souhaite séparer en un tableau. Toutefois, le fichier CSV est un mélange de chaînes et de nombres, les chaînes étant entre guillemets et pouvant contenir des virgules.

Par exemple, je pourrais avoir un CSV comme suit:

1,"Hello",2,"World",3,"Hello, World" 

Je voudrais que la chaîne soit divisée en:

 1 "Hello" 2 "World" 3 "Hello, World" 

Si j’utilise Ssortingng.Split(','); Je reçois:

 1 "Hello" 2 "World" 3 "Hello World" 

Y a-t-il un moyen facile de faire ça? Une bibliothèque déjà écrite ou dois-je parsingr la chaîne caractère par caractère?

L’article “A Fast CSV Reader” sur Code Project. Je l’ai utilisé avec bonheur plusieurs fois.

Ssortingng.Split () est icky pour cela. Non seulement il présente de mauvais cas où cela ne fonctionne pas comme celui que vous venez de trouver (et d’autres que vous n’avez pas encore vus), mais la performance est également loin d’être idéale. Le FastCSVReader posté par d’autres fonctionnera, il y a un parsingur CSV décent intégré au framework (Microsoft.VisualBasic.TextFieldParser) et j’ai un parsingur simple qui se comporte correctement et répond correctement à cette question .

Je suggère d’utiliser l’une des solutions suivantes, testait juste quelques-unes d’entre elles (d’où le retard): –

  1. Virgules correspondant aux expressions rationnelles non trouvées dans une double aprostophe englobante
  2. Un lecteur CSV rapide – pour lecture CSV uniquement
  3. FileHelpers Library 2.0 – pour CSV en lecture / écriture

J’espère que cela t’aides.

Ce n’est pas la solution la plus élégante, mais la plus rapide si vous souhaitez simplement copier et coller du code rapidement (en évitant d’importer des DLL ou d’autres bibliothèques de code):

  private ssortingng[] splitQuoted(ssortingng line, char delimeter) { ssortingng[] array; List list = new List(); do { if (line.StartsWith("\"")) { line = line.Subssortingng(1); int idx = line.IndexOf("\""); while (line.IndexOf("\"", idx) == line.IndexOf("\"\"", idx)) { idx = line.IndexOf("\"\"", idx) + 2; } idx = line.IndexOf("\"", idx); list.Add(line.Subssortingng(0, idx)); line = line.Subssortingng(idx + 2); } else { list.Add(line.Subssortingng(0, Math.Max(line.IndexOf(delimeter), 0))); line = line.Subssortingng(line.IndexOf(delimeter) + 1); } } while (line.IndexOf(delimeter) != -1); list.Add(line); array = new ssortingng[list.Count]; list.CopyTo(array); return array; }