En C #, ¿cómo puedo crear un objeto TextReader desde una cadena (sin escribir en el disco)

126

Estoy usando A Fast CSV Reader para analizar un texto pegado en una página web. El lector Fast CSV requiere un objeto TextReader, y todo lo que tengo es una cadena. ¿Cuál es la mejor manera de convertir una cadena en un objeto TextReader sobre la marcha?

¡Gracias!

Actualización- Código de muestra- En la muestra original, un nuevo StreamReader está buscando un archivo llamado "data.csv". Espero suministrarlo a través de TextBox_StartData.Text.

El uso de este código a continuación no se compila.

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

El new StreamReader(sr)me dice que tiene algunos argumentos no válidos. ¿Algunas ideas?

Como un enfoque alternativo, he intentado esto:

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

pero obtengo un Illegal characters in path Error.Aquí hay una muestra de la cadena 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

¿Alguna idea si este es el enfoque correcto? ¡De nuevo, gracias por tu ayuda!

Hairgami_Master
fuente

Respuestas:

241

Utilice System.IO.StringReader :

using(TextReader sr = new StringReader(yourstring))
{
    DoSomethingWithATextReader(sr);
}
Steve B
fuente
9

Usa la StringReaderclase, que hereda TextReader.

Ilia G
fuente
3
TextReaderNo es una interfaz, es una clase abstracta.
svick
4

Quieres un StringReader

var val = "test string";
var textReader = new StringReader(val);
scottm
fuente
4

StringReader es un TextReader( StreamReadertambién lo es, pero para leer desde secuencias). Entonces, tomando su primer ejemplo y simplemente usándolo para construir el en CsvReaderlugar de tratar de construir un a StreamReaderpartir de él primero da:

TextReader sr = new StringReader(TextBox_StartData.Text);
using(CsvReader csv = new CsvReader(sr, true))
{
  DetailsView1.DataSource = csv;
  DetailsView1.DataBind();
}
Jon Hanna
fuente
Gracias Jon ... Creo que hay un error con Fast CSV Framework. Estoy obteniendo un resultado como este:! screencast.com/t/5wZRrjDMO ...
Hairgami_Master
Mi CSV es fname, lname, correo electrónico john, doe, jd @ email.com
Hairgami_Master
1
Eso (después de ver el código fuente para ver que se está vinculando a screencast.com/t/5wZRrjDMO de todos modos) parece que está produciendo una serie de matrices de cadenas (una para cada línea) e intentando representarlas, lo que resulta en el texto "System.String []" repite. Esto me parece un resultado razonable de un analizador CSV, no manejado bien. Intente enviarlo a una vista de cuadrícula y vea qué sucede.
Jon Hanna
Gracias Jon. En realidad, estoy usando un GridView, he probado un par de ellos, pero supongo que los datos se devuelven correctamente, solo es cuestión de elegir el Control de visualización de datos correcto.
Hairgami_Master
1
Tiendo a no hacer un uso intensivo de los controles, por lo que puede haber algo que me falta. El resultado parece ser una serie de matrices de cadenas (una matriz para cada fila, una cadena para cada celda), lo que tiene sentido. No estoy seguro de por qué no funciona más allá de eso, me temo :(
Jon Hanna