Laden...

auslesen von Textdatei

Erstellt von Strahlemann vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.725 Views
S
Strahlemann Themenstarter:in
60 Beiträge seit 2006
vor 17 Jahren
auslesen von Textdatei

Ich habe ein Problem, und zwar möchte ich eine Textdatei auslesen und nach einer bestimmten Indexnummer suchen und den Zugehörigen Text ausgeben lassen.

z.B.

1234 Hallo das ist der Text
2623 das ist noch ein Text

wenn man in der Textdatei nach 1234 sucht soll er "Hallo das ist der Text" ausgeben können.
ich habe mir gedacht das man vielleicht mit SubStrings was machen könnte.
z.B.

von 0 bis 5 = IndexNummer
von 6 bis 100 = Text

allerdings habe ich als Anfänger keinen blassen Schimmer wie ich das machen soll, ich hoffe ihr könnt mir mit Code aushelfen, im Netz habe ich nur Beispiele gefunden die zeigen wie man überhaupt was ausliest !!

Grüße

N
19 Beiträge seit 2005
vor 17 Jahren

Du ich weiss leider nicht, welche genauen Anforderungen du da hast, sprich wie performant das alles sein soll, wie oft der Zugriff ist etc, aber du hast dir ja schon überlegt, dass du es einlesen willst und dann per substring lösen. Dann mach das doch einfach :p

Las die Datei Zeile für Zeile ein, dann bekommste jede Zeile in einem String.

String.Substring(int Startwert,int AnzahlStellen) und schau obs dein Index ist. wenn ja, lieste den Rest aus, mit dem gleichen Befehlt. Wenn du lernen willst, sollte das als Hilfe genügen.

187 Beiträge seit 2005
vor 17 Jahren

die Klasse StreamReader könnte dir weiterhelfen. Diese müsste die Methode ReadLine beinhalten. Dir bleibt keine andere Wahl als alle Zeilen durchzugehen bis du die zutreffende gefunden hast. Ein kleines Beispiel.


string strTextOutput;
int iIndex = 123;
bool bFound = false;
System.IO.FileStream ioFileStream = new System.IO.FileStream("C:\Test.txt", FileMode.Open, FileAccess.Read);
System.IO.StreamReader ioReader = new StreamReader(ioFileStream);
while (!ioReader.EndOfStream)
{
	string[] strLine = ioReader.ReadLine().Split(' ');
	if (Convert.ToInt32(strLine[0]) == iIndex)
	{
		strTextOutput = strLine[1];
		bFound = true;
		break;
	}
}
if (bFound)
	MessageBox.Show(strTextOutput);
else
	MessageBox.Show("Der angegebene Index wurde nicht gefunden.");

Ahja. hätte fast noch vergessen den Stream wieder zu schliessen.

ioReader.Close();

Und auch gleich der erste Bug ^^
bei der Split Methode müsstest du noch einen zweiten Parameter angeben, und zwar den Counter. Da du zwei stück haben möchtest und der danach aufhören soll zu splitten würde ich mal sagen währe es die zahl 2 für zwei teilzeichenketten.

S
Strahlemann Themenstarter:in
60 Beiträge seit 2006
vor 17 Jahren

also es werden wohl so Tausend Zeilen werden die ich durchsuchen muss, und ein Zugriff wird wohl nur alle paar Minuten stattfinden. Ich bin ja bemüht zu lernen allerdings wenn es hakt wird so was schnell zur Lebensaufgabe, also hier ein wenig Code der aber Fehlerhaft ist:


public int iIndexnummer = 1234;

public string sIndex;
public string sText;


void DateiLesen()
        {
            StreamReader myReader = new Streamreader(@"c:\text.txt");
            
            public string TextderDatei;

            while ((TextderDatei = myReader.ReadLine()) != null)
                        {
                          if (TextderDatei.Substring(0,6) = iIndexNummer) 
                             { 
                              MessageBox.Show("die IndexNummer lautet"+TextderDatei.Substring(0,6));  
                             
                              MessageBox.Show("der Text lautet"+TextderDatei.Substring(7,100));
                        }

            myReader.Close();
        }

die Frage ist ob man das so machen kann, oder wie kann man es besser machen und wie bekomme ich die Fehler weg ????

Grüße

187 Beiträge seit 2005
vor 17 Jahren

Was an deinem beispiel nicht funktioniert ist der logische vergleich einer Zahl und einer Zeichenkette. Außerdem hast du einen zuweisungsoperator verwendet und keinen logischen operator.

if (Convert.ToInt32(TextderDatei.Substring(0,6)) == iIndexNummer)

das müsste funktionieren. hab sonst beim überfliegen keine fehler gefunden.

Außerdem kann es sein, dass du bei der Sache schnell an die Grenzen des Möglichen stoßen wirst. ab 99999 Zeilen wird's eng bei dir 😉 du wirst zwar nicht so viele zeilen haben, wie du gesagt hast, aber nur zur info.

Und weiter: du musst alle tausender und hunderter natürlich auch mit leerzeichen auffüllen. ich zeigs dir mal:

00001 text
00002 text2
...
02452 text bla

chlor? ^^

denn sonst könnte dir bei folgender zeichenkette was passieren. siehe:

1 Text ganz viel text und noch mehr text
beim Substring(0,6) passiert folgendes. Du Erhälst diese Zeichenkette "1 Text" und das kannst du nicht in eine Zahl konvertieren.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Strahlemann,

[Tutorial] Alles über Dateien 2.0

herbivore

S
Strahlemann Themenstarter:in
60 Beiträge seit 2006
vor 17 Jahren

also schon mal vielen Dank für die Antworten, vielen Dank Vassili und Neotrix.
Ich habs jetzt hinbekommen 🙂 ich habe es mit Split gemacht

string[] stest = TextderDatei.Split('\t');

so ist der Index und den Text elegant getrennt, das auslesen des Textes, selbst bei ein paar Tausend einträgen, dauert auf meinem Pocket PC nur so ne halbe Sekunde, ich denke das reicht, bei mehreren Zehntausend einträgen dauert es schon so zwei, drei Sekunden, naja weiß auch gar nicht wie man das da schneller machen könnte.