W C #, jak mogę utworzyć obiekt TextReader z ciągu (bez zapisywania na dysku)

126

Używam szybkiego czytnika CSV do analizowania wklejonego tekstu na stronie internetowej. Czytnik Fast CSV wymaga obiektu TextReader, a wszystko, co mam, to ciąg. Jaki jest najlepszy sposób na konwersję ciągu znaków na obiekt TextReader w locie?

Dzięki!

Aktualizacja - przykładowy kod - w oryginalnym przykładzie nowy StreamReader szuka pliku o nazwie „data.csv”. Mam nadzieję, że dostarczę go za pośrednictwem TextBox_StartData.Text.

Użycie tego kodu poniżej nie powoduje kompilacji.

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

new StreamReader(sr)Mówi mi, że ma pewne nieprawidłowe argumenty. Jakieś pomysły?

Jako alternatywne podejście próbowałem tego:

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

ale dostaję Illegal characters in path Error.Oto próbka ciągu z 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

Jakieś pomysły, jeśli to właściwe podejście? Jeszcze raz dziękujemy za pomoc!

Hairgami_Master
źródło

Odpowiedzi:

9

Użyj StringReaderklasy, która dziedziczy TextReader.

Ilia G
źródło
3
TextReadernie jest interfejsem, to klasa abstrakcyjna.
svick
4

Chcesz StringReader

var val = "test string";
var textReader = new StringReader(val);
scottm
źródło
4

StringReader jestTextReader ( StreamReaderjest również, ale do odczytu strumienie). Więc biorąc pierwszy przykład i po prostu używając go do skonstruowania CsvReaderzamiast próbować skonstruować StreamReaderz niego najpierw, otrzymujemy:

TextReader sr = new StringReader(TextBox_StartData.Text);
using(CsvReader csv = new CsvReader(sr, true))
{
  DetailsView1.DataSource = csv;
  DetailsView1.DataBind();
}
Jon Hanna
źródło
Dzięki Jon ... Myślę, że jest błąd w Fast CSV Framework. Otrzymuję wynik, który wygląda następująco:! screencast.com/t/5wZRrjDMO ...
Hairgami_Master
Mój plik CSV to fname, lname, email john, doe, jd @ email.com
Hairgami_Master
1
To (po wyświetleniu źródła, aby zobaczyć, że i tak łączysz się z screencast.com/t/5wZRrjDMO ) wygląda na to, że tworzysz serię tablic ciągów (po jednym dla każdej linii) i próbujesz je renderować, co skutkuje tekst „System.String []” powtórzył się. Wydaje mi się, że jest to rozsądny wynik z parsera CSV, źle obsługiwany. Spróbuj przesłać go do widoku siatki i zobacz, co się stanie.
Jon Hanna,
Dzięki Jon- Właściwie używam GridView, wypróbowałem kilka z nich, ale zgaduję, że dane są zwracane prawidłowo, to tylko kwestia wyboru odpowiedniej kontroli wyświetlania danych .. ??
Hairgami_Master
1
Zwykle nie używam zbyt często elementów sterujących, więc może być coś, czego mi brakuje. Wynik wydaje się być serią tablic ciągów (jedna tablica na każdy wiersz, jeden ciąg na każdą komórkę), co ma sens. Nie jestem pewien, dlaczego to nie działa poza tym, obawiam się :(
Jon Hanna,