Question

Je cherche à analyser une chaîne délimitée, quelque chose de l'ordre de

abc

Mais il s’agit d’un exemple très simple, et l’analyse de données délimitées peut devenir complexe ;par exemple

1,"Votre algorithme simple, il échoue",Vrai

ferait exploser votre implémentation naïve de string.Split en bits.Existe-t-il quelque chose que je peux librement utiliser/voler/copier et coller qui offre une solution relativement à toute épreuve pour analyser du texte délimité ?.NET, plox.

Mise à jour: J'ai décidé d'y aller avec le TextFieldParser, qui fait partie de la pile de cadeaux de VB.NET cachés dans Microsoft.VisualBasic.DLL.

Était-ce utile?

La solution

J'utilise ceci pour lire un fichier

string filename = @textBox1.Text;
string[] fields;
string[] delimiter = new string[] {"|"};
using (Microsoft.VisualBasic.FileIO.TextFieldParser parser =
       new Microsoft.VisualBasic.FileIO.TextFieldParser(filename)) {
    parser.Delimiters = delimiter;
    parser.HasFieldsEnclosedInQuotes = false;

    while (!parser.EndOfData) {
        fields = parser.ReadFields();
        //Do what you need
    }
}

Je suis sûr que quelqu'un ici peut transformer cela pour analyser une chaîne en mémoire.

Autres conseils

Une bibliothèque très complète peut être trouvée ici : Aides-fichiers

Je ne connais aucun framework, mais une simple machine à états fonctionne :

  • État 1 :Lisez chaque caractère jusqu'à ce que vous atteigniez un " ou un ,
    • En cas de " :Passer à l'État 2
    • En cas de :Passer à l'État 3
    • En cas de fin de dossier :Passer à l'état 4
  • État 2 :Lisez chaque caractère jusqu'à ce que vous atteigniez un "
    • En cas de " :Passer à l'État 1
    • En cas de fin de fichier :Soit passer à l'état 4, soit signaler une erreur en raison d'une chaîne non terminée
  • État 3 :Ajoutez le tampon actuel au tableau de sortie, déplacez le curseur derrière le et revenez à l'état 1.
  • État 4 :c'est l'état final, ne fait rien d'autre que renvoyer le tableau de sortie.

Tel que

var elements = new List<string>();
var current = new StringBuilder();
var p = 0;

while (p < internalLine.Length) {
    if (internalLine[p] == '"') {
        p++;

        while (internalLine[p] != '"') {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past last ',
        p += 2;
    }
    else {
        while ((p < internalLine.Length) && (internalLine[p] != ',')) {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past ,
        p++;
    }

    elements.Add(current.ToString());
    current.Length = 0;
}

Il y a quelques bonnes réponses ici : Diviser une chaîne en ignorant les sections entre guillemets

Vous souhaiterez peut-être reformuler votre question pour quelque chose de plus précis (par ex. Quel extrait de code ou bibliothèque puis-je utiliser pour analyser les données CSV dans .NET?).

Pour faire un plug sans vergogne, je travaille depuis un moment sur une bibliothèque appelée fotelo (Formatted Text Loader) que j'utilise pour analyser rapidement de grandes quantités de texte en fonction d'un délimiteur, d'une position ou d'une expression régulière.Pour une chaîne rapide, c'est excessif, mais si vous travaillez avec des journaux ou de grandes quantités, cela peut être exactement ce dont vous avez besoin.Il fonctionne sur un modèle de fichier de contrôle similaire à SQL*Loader (une sorte d'inspiration derrière cela).

Mieux vaut tard que jamais (ajouter à l'exhaustivité de SO) :

http://www.codeproject.com/KB/database/CsvReader.aspx

Celui-ci règne en maître.

GJ

Je pense qu'un cadre générique devrait préciser entre deux choses :1.Quels sont les caractères délimitants.2.Dans quelles conditions ces caractères ne comptent-ils pas (par exemple lorsqu'ils sont entre guillemets).

Je pense qu'il serait peut-être préférable d'écrire une logique personnalisée à chaque fois que vous devez faire quelque chose comme ça.

Le moyen le plus simple consiste simplement à diviser la chaîne en un tableau de caractères et à rechercher vos déterminants de chaîne et vos caractères divisés.

Il devrait être relativement facile de réaliser des tests unitaires.

Vous pouvez l'envelopper dans une méthode d'extension similaire à la méthode de base .Spilt.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top