Question

En Java il y a une classe agréable appelée Scanner pour la lecture de chaînes et des flux d'un certain format à des structures de données comme les entiers, flottants, ... Y at-il équivalent en Mono? Dans .Net il y a un lecteur binaire, mais il lit les données sous forme de fichiers binaires. Je veux une classe qui a lu les données par l'analyse à partir d'une chaîne.

EDIT: réaction sur les réponses actuelles, je sais que la plupart des données-types ont une analyse syntaxique méthode, mais le problème avec ceux-ci sont, ils ne lisent pas la chaîne séquentielle. En Java, vous simplement l'objet d'initialiser, et en activant les méthodes, vous lisez séquentiellement les données-types.

Était-ce utile?

La solution

Eh bien, puisque vous lisez un fichier dans les cas de test, je vais supposer que vous connaissez le format exact des données à venir et comment il doit être analysé. En regardant la classe Parser de Java dans la documentation ne fait paraître très compliqué ou bien plus qu'une classe de commodité. Il semble que tokenizer la chaîne de flux sur les espaces et fournir des fonctions pour prendre le jeton et l'analyser. Et pour autant que je sache, .Net ne possède pas de classe équivalente. Donc, si vous voulez un pour la réutilisation, alors vous devrez écrire vous-même.

Mais l'algorithme de base dont vous avez besoin est de lire le contenu du fichier, diviser les jetons, et les analyser. Si votre fichier est de taille raisonnable, vous pouvez utiliser File.ReadAllLines() qui lit le contenu de la ligne par ligne dans un fichier String[]. Ou vous pouvez utiliser une classe StreamReader pour lire les lignes une à la fois en utilisant son ReadLine(). Ensuite, une fois que vous les avez en ligne, vous les tokenizer avec String de Split(), puis les analyser.

Ne sachant pas exactement comment vous devez utiliser les valeurs dans le fichier, un modèle très basique pourrait être:

// Read in the whole file
String[] strLines = File.ReadAllLines(strFilePath);

// Loop through each of the lines to process their contents
foreach (String strLine in strLines) {
    // Tokenize on the spaces
    String[] strTokens = strLine.Split(' ');

    // Parse the values
    int iIntValue = Int.Parse(strTokens[0]);
    double dDoubleValue = Double.Parse(strTokens[1]);

    // Do something with the values
}

Créer votre propre classe Parser vous permettra de maintenir l'état et des jetons avance automatique que vous les utilisez. Si vous choisissez cette voie, le StreamReader peut être la meilleure option.

Autres conseils

La plupart des types de données de base auront une des méthodes de .Parse et .TryParse() qui le fera pour vous.

Par exemple, la méthode Int32.TryParse .

Dans .NET, beaucoup de type ont .Parse() statique et les méthodes de .TryParse() qui prend un paramètre String.

Vous pouvez faire quelque chose comme:

Stream s = new Stream();
// Wire up the stream.

StreamReader reader = new StreamReader(s);
String value = reader.ReadToEnd();

int valueAsInt = Int32.TryParse(value);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top