Wie kann ich in C # ein TextReader-Objekt aus einer Zeichenfolge erstellen (ohne auf die Festplatte zu schreiben)?

126

Ich verwende einen schnellen CSV-Reader , um eingefügten Text in eine Webseite zu analysieren. Der Fast CSV Reader benötigt ein TextReader-Objekt und ich habe nur eine Zeichenfolge. Was ist der beste Weg, um eine Zeichenfolge im laufenden Betrieb in ein TextReader-Objekt zu konvertieren?

Vielen Dank!

Update- Beispielcode- Im Originalbeispiel sucht ein neuer StreamReader nach einer Datei mit dem Namen "data.csv". Ich hoffe, es über TextBox_StartData.Text liefern zu können.

Die Verwendung dieses Codes unten wird nicht kompiliert.

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

Das new StreamReader(sr)sagt mir, dass es einige ungültige Argumente hat. Irgendwelche Ideen?

Als alternativen Ansatz habe ich Folgendes versucht:

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

aber ich bekomme eine Illegal characters in path Error.Hier ist ein Beispiel der Zeichenfolge von 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

Irgendwelche Ideen, ob dies der richtige Ansatz ist? Danke nochmal für deine Hilfe!

Hairgami_Master
quelle

Antworten:

241

Verwenden Sie System.IO.StringReader :

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

Verwenden Sie die StringReaderKlasse, die erbt TextReader.

Ilia G.
quelle
3
TextReaderist keine Schnittstelle, es ist eine abstrakte Klasse.
Svick
4

Sie möchten einen StringReader

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

StringReader ist ein TextReader( StreamReaderist auch, aber zum Lesen aus Streams). Wenn Sie also Ihr erstes Beispiel nehmen und es nur verwenden, um das zu konstruieren, CsvReaderanstatt zuerst zu versuchen, ein StreamReaderdaraus zu konstruieren, erhalten Sie:

TextReader sr = new StringReader(TextBox_StartData.Text);
using(CsvReader csv = new CsvReader(sr, true))
{
  DetailsView1.DataSource = csv;
  DetailsView1.DataBind();
}
Jon Hanna
quelle
Danke Jon ... Ich denke, es gibt einen Fehler im Fast CSV Framework. Ich erhalte ein Ergebnis, das so aussieht :! screencast.com/t/5wZRrjDMO ...
Hairgami_Master
Meine CSV ist fname, lname, email john, doe, jd @ email.com
Hairgami_Master
1
Das (nachdem ich die Quelle angezeigt habe, um zu sehen, dass Sie ohnehin auf screencast.com/t/5wZRrjDMO verlinken ) sieht so aus, als würden Sie eine Reihe von Arrays von Strings (eines für jede Zeile) erstellen und versuchen, sie zu rendern, was dazu führt Der Text "System.String []" wurde wiederholt. Das klingt für mich nach einem vernünftigen Ergebnis eines CSV-Parsers, der nicht gut gehandhabt wird. Versuchen Sie, es in einer Rasteransicht auszugeben, und sehen Sie, was passiert.
Jon Hanna
Danke Jon. Eigentlich verwende ich ein GridView. Ich habe einige davon ausprobiert, aber ich vermute, dass die Daten ordnungsgemäß zurückgegeben werden. Es ist nur eine Frage der Auswahl der richtigen Datenanzeigesteuerung.
Hairgami_Master
1
Ich benutze Steuerelemente in der Regel nicht sehr häufig, daher fehlt mir möglicherweise etwas. Die Ausgabe scheint eine Reihe von Arrays von Strings zu sein (ein Array für jede Zeile, ein String für jede Zelle), was Sinn macht. Ich bin mir nicht sicher, warum es darüber hinaus nicht funktioniert :(
Jon Hanna