En C #, comment puis-je créer un objet TextReader à partir d'une chaîne (sans écrire sur le disque)

126

J'utilise un lecteur CSV rapide pour analyser du texte collé dans une page Web. Le lecteur Fast CSV nécessite un objet TextReader et tout ce que j'ai est une chaîne. Quelle est la meilleure façon de convertir une chaîne en un objet TextReader à la volée?

Merci!

Mise à jour - Exemple de code - Dans l'exemple d'origine, un nouveau StreamReader recherche un fichier appelé «data.csv». J'espère le fournir via TextBox_StartData.Text.

L'utilisation de ce code ci-dessous ne compile pas.

        TextReader sr = new StringReader(TextBox_StartData.Text);
        using (CsvReader csv = new CsvReader(new StreamReader(sr), true))
        {
            DetailsView1.DataSource = csv;
            DetailsView1.DataBind();
        }

Le new StreamReader(sr)me dit qu'il a des arguments invalides. Des idées?

En guise d'approche alternative, j'ai essayé ceci:

        TextReader sr = new StreamReader(TextBox_StartData.Text);
        using (CsvReader csv = new CsvReader(sr, true))
        {
            DetailsView1.DataSource = csv;
            DetailsView1.DataBind();
        }

mais j'obtiens un Illegal characters in path Error.Voici un échantillon de la chaîne de TextBox_StartData.Text:

Fname\tLname\tEmail\nClaude\tCuriel\tClaude.Curiel@email.com\nAntoinette\tCalixte\tAntoinette.Calixte@email.com\nCathey\tPeden\tCathey.Peden@email.com\n

Des idées si c'est la bonne approche? Merci encore pour votre aide!

Hairgami_Master
la source

Réponses:

9

Utilisez la StringReaderclasse, qui hérite TextReader.

Ilia G
la source
3
TextReadern'est pas une interface, c'est une classe abstraite.
svick
4

Vous voulez un StringReader

var val = "test string";
var textReader = new StringReader(val);
Scottm
la source
4

StringReader est un TextReader( StreamReaderest aussi, mais pour la lecture à partir de flux). Donc, prendre votre premier exemple et l'utiliser simplement pour construire le CsvReaderplutôt que d'essayer de construire un à StreamReaderpartir de celui-ci donne d'abord:

TextReader sr = new StringReader(TextBox_StartData.Text);
using(CsvReader csv = new CsvReader(sr, true))
{
  DetailsView1.DataSource = csv;
  DetailsView1.DataBind();
}
Jon Hanna
la source
Merci Jon ... Je pense qu'il y a un bug avec le Fast CSV Framework. J'obtiens un résultat qui ressemble à ceci:! screencast.com/t/5wZRrjDMO ...
Hairgami_Master
Mon CSV est fname, lname, email john, doe, jd @ email.com
Hairgami_Master
1
Cela (après avoir vu la source pour voir que vous créez un lien vers screencast.com/t/5wZRrjDMO de toute façon) semble que vous produisez une série de tableaux de chaînes (un pour chaque ligne), et essayez de les rendre, ce qui se traduit par le texte "System.String []" répété. Cela me semble être un résultat raisonnable d'un analyseur CSV, mal géré. Essayez de le sortir dans une vue en grille et voyez ce qui se passe.
Jon Hanna
Merci Jon- En fait, j'utilise un GridView, j'en ai essayé quelques-uns, mais je suppose que les données sont renvoyées correctement, c'est juste une question de choisir le bon contrôle d'affichage des données .. ??
Hairgami_Master
1
J'ai tendance à ne pas faire un usage intensif des commandes, donc il y a peut-être quelque chose qui me manque. La sortie semble être une série de tableaux de chaînes (un tableau pour chaque ligne, une chaîne pour chaque cellule), ce qui est logique. Je ne sais pas pourquoi cela ne fonctionne pas au-delà, j'ai peur :(
Jon Hanna