Em C #, como posso criar um objeto TextReader a partir de uma seqüência de caracteres (sem gravar no disco)

126

Estou usando o A Fast CSV Reader para analisar algum texto colado em uma página da web. O leitor Fast CSV requer um objeto TextReader, e tudo o que tenho é uma string. Qual é a melhor maneira de converter uma string em um objeto TextReader em tempo real?

Obrigado!

Atualizar - código de exemplo - no exemplo original, um novo StreamReader está procurando um arquivo chamado "data.csv". Espero fornecê-lo via TextBox_StartData.Text.

Usar este código abaixo não é compilado.

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

O new StreamReader(sr)me diz que tem alguns argumentos inválidos. Alguma ideia?

Como uma abordagem alternativa, tentei o seguinte:

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

mas recebo um Illegal characters in path Error.Aqui está um exemplo da string 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

Alguma idéia se esta é a abordagem correta? Obrigado novamente por sua ajuda!

Hairgami_Master
fonte

Respostas:

241

Use System.IO.StringReader :

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

Use a StringReaderclasse que herda TextReader.

Ilia G
fonte
3
TextReadernão é uma interface, é uma classe abstrata.
svick
4

Você quer um StringReader

var val = "test string";
var textReader = new StringReader(val);
escocês
fonte
4

StringReader é um TextReader( StreamReadertambém, mas para leitura de fluxos). Portanto, pegue o seu primeiro exemplo e use-o para construir o, em CsvReadervez de tentar construir um a StreamReaderpartir dele, primeiro:

TextReader sr = new StringReader(TextBox_StartData.Text);
using(CsvReader csv = new CsvReader(sr, true))
{
  DetailsView1.DataSource = csv;
  DetailsView1.DataBind();
}
Jon Hanna
fonte
Obrigado Jon ... Acho que há um erro no Fast CSV Framework. Estou obtendo um resultado parecido com o seguinte:! screencast.com/t/5wZRrjDMO ...
Hairgami_Master
Meu CSV é fname, lname, e-mail john, doe, jd @ email.com #
Hairgami_Master
1
Isso (depois que eu vejo a fonte para ver que você está vinculando a screencast.com/t/5wZRrjDMO de qualquer maneira) parece que você está produzindo uma série de matrizes de strings (uma para cada linha) e tentando renderizá-las, o que resulta em o texto "System.String []" repetido. Isso me parece um resultado razoável de um analisador de CSV, que não foi bem tratado. Tente enviá-lo para uma visualização em grade e veja o que acontece.
Jon Hanna
Obrigado Jon- Na verdade, estou usando um GridView, tentei alguns deles, mas acho que os dados estão sendo retornados corretamente, é apenas uma questão de escolher o controle de exibição de dados correto .. ??
Hairgami_Master
1
Como não uso muito os controles, pode haver algo que esteja faltando. A saída parece ser uma série de matrizes de strings (uma matriz para cada linha, uma string para cada célula), o que faz sentido. Não sei por que ele não está funcionando além do que eu tenho medo :(
Jon Hanna
1

Se você olhar para a documentaçãoTextReader , verá duas classes herdadas. E um deles é StringReader, o que parece fazer exatamente o que você deseja.

svick
fonte