tutorials.de Buch-Aktion 02/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
16
ZUGRIFFE
2159
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von mordillo
    mordillo mordillo ist offline Mitglied Bronze
    Registriert seit
    Feb 2004
    Beiträge
    43
    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 :
    1
    2
    3
    4
    5
    6
    
        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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
         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
     
    VC#.net - Auf gehts

  2. #2
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    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.
    Geändert von Kachelator (19.12.04 um 21:20 Uhr)
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  3. #3
    Avatar von mordillo
    mordillo mordillo ist offline Mitglied Bronze
    Registriert seit
    Feb 2004
    Beiträge
    43
    ....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
     
    VC#.net - Auf gehts

  4. #4
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Ü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.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  5. #5
    Avatar von mordillo
    mordillo mordillo ist offline Mitglied Bronze
    Registriert seit
    Feb 2004
    Beiträge
    43
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    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 :
    1
    2
    3
    
    ListView
    [U]Satz Nr.                    X                         Y                   Z                    Radius[/U]
    1                        10000                   10000                    0                    15

    usw.

    Ich hoffe das es anschaulich ist.
     
    VC#.net - Auf gehts

  6. #6
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    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
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  7. #7
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Das würde ich ungefähr so machen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    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!
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  8. #8
    Avatar von mordillo
    mordillo mordillo ist offline Mitglied Bronze
    Registriert seit
    Feb 2004
    Beiträge
    43
    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 :
    1
    
    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.

     
    VC#.net - Auf gehts

  9. #9
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Oops, Tippfehler! Da muss noch ein einzelnes Hochkomma hinter das '\t'!
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  10. #10
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Zitat Zitat von mordillo
    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 :
    1
    
    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.

    Regex ist im Namespace System.Text.RegularExpressions.
    Ich habs das Ding ausprobiert, das geht.
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  11. #11
    Avatar von mordillo
    mordillo mordillo ist offline Mitglied Bronze
    Registriert seit
    Feb 2004
    Beiträge
    43
    Ich hab mich für diese Variante entschieden, da dies meinen Bedürnissen am ehesten entspricht. Wenn ich jetzt auch noch verstehen würde wie du die line zerlegt hast ... das wär was wert.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    private void button1_Click(object sender, System.EventArgs e)
            {
                cdl.InitialDirectory = "C:" ;
                cdl.Filter ="Alle Dateien(*.*)|*.*";
                cdl.Title ="Öffne Koordinaten";
                cdl.ShowDialog() ;
                
                string path = cdl.FileName;
                if (File.Exists(path)) 
                
                    using (StreamReader reader = new StreamReader(path))
                    {
                        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)
                            {
            
                                ListViewItem item1 = new ListViewItem(m.Groups["ID"].ToString (),0);
                                item1.SubItems.Add ( m.Groups["Param1"].ToString ());
                                item1.SubItems.Add ( m.Groups["Param2"].ToString ());
                                item1.SubItems.Add ( m.Groups["Param3"].ToString ());
                                item1.SubItems.Add ( m.Groups["Param4"].ToString ());
                                listView1.Items.AddRange(new ListViewItem[]{item1});
                                this.Controls.Add (listView1);
     
     
                            }
                        }
                    }
                
            
                
                
                
            }

    Erstmal herzlichsten an beide für eure Mühe
     
    VC#.net - Auf gehts

  12. #12
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Ich verwende einen regulären Ausdruck. Das Tool wenns um verarbeiten von Zeichenketten geht. =)
    Solltest mal reinlesen.. =)
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  13. #13
    Avatar von mordillo
    mordillo mordillo ist offline Mitglied Bronze
    Registriert seit
    Feb 2004
    Beiträge
    43
    Cool, danke.

    Was mich jetzt allerdings zu meinem nächsten Problem bringt, asl ich weiter programmieren wollte.

    Die einzulesenden Werte befinden sich nun wie gewollt im ListView, allerdings muß ich mit den Werten Rechenoperationen ausführen. Lege also int Var an und Versuche die Item Inhalte in die int Variablen zu schieben ,,,,,, möööp geht wieder nicht aufgrund der impliziten Konvertierung ... Na gut wandel ich vorher von Hand um .... Gibt es wieder keine Funktion mit der ich von Strong to Int wandeln kann ....

    Variablen vom Typus Variant wie bei VB gibt es wohl nicht hier, oder ?

    Gruß
     
    VC#.net - Auf gehts

  14. #14
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    So geht umwandeln:

    Code :
    1
    2
    
    string text = "4711";
    int zahl = Int32.Parse( text );
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  15. #15
    Avatar von mordillo
    mordillo mordillo ist offline Mitglied Bronze
    Registriert seit
    Feb 2004
    Beiträge
    43
    Danke für die Superschnelle Antwort.

    Warum ist denn hier alles so umständlich, ich dachte C# sollte so einfach sein( wohl falsch gedacht)
     
    VC#.net - Auf gehts

Ähnliche Themen

  1. scp, nur textdateien
    Von PhoenixDH im Forum Linux & Unix
    Antworten: 2
    Letzter Beitrag: 14.09.05, 08:15
  2. Schreibschutz bei TextDateien
    Von Mailyn im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 02.09.05, 09:54
  3. Textdateien verändern ?
    Von isiprofil im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 11.08.04, 13:26
  4. seek in textdateien
    Von savar im Forum Delphi, Kylix, Pascal
    Antworten: 2
    Letzter Beitrag: 17.06.04, 15:56
  5. PHP-Chat mit Textdateien...
    Von Feldhofe im Forum PHP
    Antworten: 7
    Letzter Beitrag: 18.12.01, 16:21