Textdateien und C#

mordillo

Mitglied
Hallo,

ich bin grad am umschwenken und zwar von VB6 zu VC#.net
Die Logik an sich ist nicht dasschwierige sondern die doch erheblich andere Syntax (finde ich zumindest).

Mein momentanes Problem:

Unter VB6 konnte ich eine Texdatei in der z.B. eine Tabelle mit Zahlen gespeichert war, sequenziell mit
Code:
    Open sFile for Input as #FNR
        Do While Not EOF(FNR)
               Input #FNR, Var1
               Input #FNR, Var2
               Input #FNR, Var3
        Loop

was mir unter C# doch etwas schwer fällt, da die Funktion 'Input' nichts vergleichbares in C# enthält (zumindest hab ich sie noch nicht gefunden)

Was ich machen kann ist:
Code:
     string path = cdl.FileName;
            if (File.Exists(path)) 
            using (StreamReader sr = File.OpenText(path))
	{
	                string a;
		while ((a = sr.ReadLine ()) !=null)
			{
				Gx++;	
				listView1.Items.Add(a);
				Gx=0;
			}
	sr.Close() ;

bringt mich aber zu dem Problem, daß ich nur Zeilenweise und nicht Blockweise einlese.

In der VB6 Methode konnte ich somit ein 3-dimensionales Int Array einlesen, bei der VC# Methode nur ein 1-dimensionales string Array einlesen.


Hmmm, kann mir jemand helfen, ohne die Split Methode nutzen zu müssen. Ich denke mal das es einen direkten Weg geben sollte um diese Aufgabe zu erledigen.



Danke im Vorraus


Mordillo
 
StreamReader kennt ja nicht nur Readline(), sondern auch Read() mit mehreren Überladungen. Hast du die schon versucht?

Ansonsten, was hast du gegen Split()?

Ich denke mal das es einen direkten Weg geben sollte um diese Aufgabe zu erledigen.
Ich habe festgestellt, dass es oft besser ist, eine Aufgabe in mehrere Schritte aufzuteilen, anstatt alles auf einmal zu machen. Ich weiss nicht, ob dir das weiterhilft, aber fiel mir gerade so ein. :)
Wenn es natürlich vorgebene Funktionen geben könnte, die genau das erledigen, was man braucht, ist es natürlich äusserst sinnvoll, diese zu suchen und zu nutzen. Jedenfalls immer besser, als sie selber zu schreiben.
 
Zuletzt bearbeitet:
....Bringt mich zu meiner nächsten Frage: Was ist im speziellen mit 'Überladung' gemeint ?

sr.Read() hab ich natürlich auch versucht, ohne gewünschten Erfolg.

Danke für die Antwort
 
Überladen ist eine Funktion, wenn es sie in mehreren Versionen gibt, die unterschiedliche Parameter erwarten. Die Trim()-Methode der string-Klasse ist ein Beispiel: Einmal gibt es sie ohne Parameter. Dann entfernt sie alle Blanks an Anfang und Ende eines Strings. Eine weitere Überladung ist string.Trim( (params char[]); Diese Version entfernt nicht Blanks, sondern all die Zeichen, die in dem char-Array übergeben wurden.

Kannst du bitte ein Beispiel posten für die Datei, wie du sie einlesen willst? Das würde es mir einfacher machen, zu verstehen, was genau du mit "blockweise" meinst.
 
Code:
1            12500        15000        0             15 
2            10000        10000        0             15 
3            20000        20000        0             15 
4            20000        0            0             15 
5            40000        0            0             15 
6            30000        -10000       0             15 
7            20000        -10000       0             15 
8            22500        -5000        0             0

So sieht die Tabelle (Beispiel, kann durchaus wesentlich länger sein, aber das spielt hier keine Rolle) aus die ich einlesen will. Handelt sich um Koordinaten und deren Parameter.
Ich möchte halt jeden Wert einer Zeile(Satz) einzeln einlesen um in dann gleich in ein ListView zu übergeben.

Code:
ListView
Satz Nr.                    X                         Y                   Z                    Radius
1                        10000                   10000                    0                    15

usw.

Ich hoffe das es anschaulich ist.
 
Hi.

Du könntest die Datei in der diese Daten enthalten sind zeilenweise lesen, mit der Split-Methode die Zeile in ein Array teilen, und dann ein ListViewItem erstellen mit den ganzen SubItems etc.

Oder du verwendest RegEx um an die einzelnen Teile einer solchen Zeile zu kommen.
Das könnte dann so aussehen.
Code:
using (StreamReader reader = new StreamReader("input.txt"))
{
  while (reader.Peek() != -1)
  {
    string line = reader.ReadLine();
    Regex regex = new Regex(@"(?<ID>\d+)\ +(?<Param1>[+|-]?\d+)\ +(?<Param2>[+|-]?\d+)\ +(?<Param3>[+|-]?\d+)\ +(?<Param4>[+|-]?\d+)", RegexOptions.Singleline);
    Match m = regex.Match(line);
    
    if (m.Success)
    {
      Console.WriteLine("#{0}\tParam1: {1}\n\tParam2: {2}\n\tParam3: {3}\n\tParam4: {4}\n\n",
                        m.Groups["ID"], m.Groups["Param1"], m.Groups["Param2"], m.Groups["Param3"], m.Groups["Param4"]);
    }
  }
}

Über m.Groups["ElementName"] kannst auf die einzelnen Zahlen zugreifen.

MfG,
Alex
 
Das würde ich ungefähr so machen:
Code:
string line;
while ((line = sr.ReadLine ()) !=null) // zeile lesen
{
  string entries[] = line.Split( new char[]{ ' ', '\t } ); // zeile zerlegen mithilfe von Blanks
  string entry0 = entries[0]; // auswerten
  string entry1 = entries[1];
  string entry2 = entries[2];
  string entry3 = entries[3];
}
Nicht vergessen, Fehler abzufangen, wenn z.B. mal eine Zeile zu kurz ist!
 
Erstmal danke für die schnellen Antworten.

Leider hat keine Methode funktioniert:
Regex und Match werden erst gar nicht erkannt

und der zweite Vorschlag enthält zuviele Zeichen in new char[]

Code:
line.Split( new char[]{ ' ', '\t } ); // zeile zerlegen

Da ich dieser Sprache erst seit einigen (effektiven) Stunden begegne, verwirrt mich die Syntax doch enorm, wenn man aus dem Hause VB6 kommt.

:confused:
 
mordillo hat gesagt.:
Erstmal danke für die schnellen Antworten.

Leider hat keine Methode funktioniert:
Regex und Match werden erst gar nicht erkannt

und der zweite Vorschlag enthält zuviele Zeichen in new char[]

Code:
line.Split( new char[]{ ' ', '\t } ); // zeile zerlegen

Da ich dieser Sprache erst seit einigen (effektiven) Stunden begegne, verwirrt mich die Syntax doch enorm, wenn man aus dem Hause VB6 kommt.

:confused:

Regex ist im Namespace System.Text.RegularExpressions.
Ich habs das Ding ausprobiert, das geht.
 

Neue Beiträge

Zurück