Comment séparer correctement un CSV en utilisant la fonction C# split ()?

supposons que j'ai ce fichier CSV:

NAME,ADDRESS,DATE
"Eko S. Wibowo", "Tamanan, Banguntapan, Bantul, DIY", "6/27/1979"

je voudrais stocker chaque token qui est fermé en utilisant un double guillemet pour être dans un tableau, y a-t-il un coffre-fort pour le faire au lieu d'utiliser la fonction String split ()? Actuellement je charge le fichier dans une RichTextBox, et ensuite en utilisant sa propriété Lines [], je fais une boucle pour chaque élément Lines [] et en faisant ceci:

string[] line = s.Split(',');

s est une référence à RichTextBox.Ligne.][ Et comme vous pouvez clairement voir, la virgule à l'intérieur d'un token peut facilement gâcher la fonction split (). Ainsi, au lieu de trois jeton comme je le veux, j'ai fini avec 6 jetons

Toute aide sera appréciée!

9
c#
demandé sur swdev 2013-06-20 11:04:22

5 réponses

vous pouvez également utiliser regex:

string input = "\"Eko S. Wibowo\", \"Tamanan, Banguntapan, Bantul, DIY\", \"6/27/1979\"";
string pattern = @"""\s*,\s*""";

// input.Substring(1, input.Length - 2) removes the first and last " from the string
string[] tokens = System.Text.RegularExpressions.Regex.Split(
    input.Substring(1, input.Length - 2), pattern);

cela vous donnera:

Eko S. Wibowo
Tamanan, Banguntapan, Bantul, DIY
6/27/1979
19
répondu unlimit 2013-06-20 07:54:02

j'ai fait ça avec ma propre méthode. Il compte simplement l'amout des caractères " et ' .

Améliorer vos besoins.

    public List<string> SplitCsvLine(string s) {
        int i;
        int a = 0;
        int count = 0;
        List<string> str = new List<string>();
        for (i = 0; i < s.Length; i++) {
            switch (s[i]) {
                case ',':
                    if ((count & 1) == 0) {
                        str.Add(s.Substring(a, i - a));
                        a = i + 1;
                    }
                    break;
                case '"':
                case '\'': count++; break;
            }
        }
        str.Add(s.Substring(a));
        return str;
    }
7
répondu joe 2013-06-20 07:32:06

ce n'est pas une réponse exacte à votre question, mais pourquoi ne pas utiliser la bibliothèque déjà écrite pour manipuler le fichier CSV, bon exemple serait LinqToCsv . CSV pourrait être délimité avec divers signes de ponctuation. De plus, il y a des gotchas, qui sont déjà abordés par les créateurs de bibliothèques. Comme le traitement de la ligne de nom, le traitement de différents formats de date et la mise en correspondance des lignes aux objets C#.

2
répondu 0lukasz0 2015-05-13 11:13:14

si votre ligne CSV est très serrée, il est plus facile d'utiliser l'enlèvement de l'extrémité et de la queue mentionné plus tôt, puis une simple division sur une chaîne de jonction

 string[] tokens = input.Substring(1, input.Length - 2).Split("\",\"");

cela ne fonctionnera que si tous les champs sont cités deux fois, même s'ils ne le sont pas (officiellement). Il sera plus rapide que RegEx mais avec des conditions données quant à son utilisation.

Vraiment utile si vos données ressemble "Nom de","1","12/03/2018","Add1,Add2,Add3","d'autres choses"

0
répondu TaSwavo 2018-04-25 21:20:15

vous pouvez remplacer "," par ; puis diviser par ;

var values= s.Replace("\",\"",";").Split(';');
0
répondu Abdul Hadi 2018-04-27 19:37:45