Announcement

Collapse
No announcement yet.

Liste von Feldern in eine Datei schreiben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Liste von Feldern in eine Datei schreiben

    Hallo Leute... Ich brauche Hilfe dabei die Objekte einer Liste in eine Datei zu schreiben...

    Hier der Codeausschnitt

    StreamWriter sw = new StreamWriter("C:\\Documents and Settings\\tbuenger\\Desktop\\dta1.txt", true, Encoding.ASCII);

    List<object> saetze = new List<object>();

    A_Satz aSatz = new A_Satz();
    aSatz.Kennzeichen = "G";
    ....
    saetze.Add(aSatz);
    ....

    sw.Close();


    Ich habe es versucht mit einer foreach-Schleife, allerdings habe ich es nicht hinbekommen... Ich bin noch Anfänger im Programmieren....

    Würde mich über ein wenig Hilfe sehr freuen

  • #2
    Hallo,

    Am einfachsten waere, wenn du mit einer foreach Schleife durch deine List<> gehts und zu jedem Eintrag ToString() aufrufst. Da es sich hier aber um Elemente vom Typ object handelt wird da nichts sinnvolles retour kommen.

    Mein Vorschlag waere, eine List<A_Satz> zu erstellen und in der Klasse A_Satz die ToString Methode zu ueberschreiben.

    Ungefaehr so:
    Code:
    List<A_Satz> saetze = new ...
     
    foreach (A_Satz item in saetze)
    {
       Console.WriteLine(item.ToString());
    }
     
    // Klasse A_Satz
    override ToString()
    {
       return this.Kennzeichen;
    }
    *-- robert.oh. --*

    Comment


    • #3
      Hallo,

      Du hast zwei Themen: Erstellen einer List<object> und Speichern als Textdatei. (Geht es um das DTAUS-Verfahren?) Dein Code-Ausschnitt befasst sich eigentlich nur mit dem Erstellen der Liste.

      Du schreibst aber nichts, wie die Daten in den StreamWriter übertragen werden sollen. Was hast Du dazu versucht?

      Wenn es um das DTAUS-Verfahren geht, musst Du sowieso umdenken: Dabei handelt es sich um eine fest definierte Byte-Folge; also musst Du auch so speichern. Das ginge über die StreamWriter.Write-Methoden; aber es geht einfacher:
      • Erzeuge einen StringBuilder sb als "Datei im Arbeitsspeicher".
      • Füge nacheinander alle Bestandteile des A-Satzes ein; das geht am besten mit String.Format - benutze die Feldlängen bei den Argumenten.
      • Füge ebenso alle Bestandteile aller C-Sätze ein.
      • Füge ebenso alle Bestandteile des E-Satzes ein.
      • Speichere die gesamte Arbeitsdatei, also sb.ToString(), ab; das geht am einfachsten mit der File.WriteAllText-Methode (String, String, Encoding).

      Wenn es nicht um DTAUS geht, denn ist die Frage, in welcher Form die Daten gespeichert und ggf. zurückgelesen werden sollen. Das wichtigste Stichwort dazu dürfte Serialization sein; aber damit habe ich mich noch nicht näher befasst.

      Gruß Jürgen

      Comment


      • #4
        Originally posted by TEXTiX-X
        Entschuldigt meine Kurzfassung an Informationen....
        Ja es handelt sich um das DTAUS-Verfahren.

        Ich habe die jeweiligen Sätze (A, C und E) in separate Klassen gebracht (A_Satz, C_Satz und E_Satz)
        Das ist vernünftig. Bei Deiner Arbeitsweise spielen die Klassen A und E keine Rolle, weil es ja jeweils nur einen Eintrag gibt; aber damit bist Du flexibel für spätere Erweiterungen.

        Wegen der unterschiedlichen Struktur (aber gleichem Aufbau) empfehle ich, die Klassen besser zu strukturieren: Eine Klasse (vielleicht reicht auch ein Interface) legt die Grundlagen für A, C, E fest; davon werden die getrennten Klassen abgeleitet; damit gibt es eine spezialisierte List<Dtaus> statt List<object>. Dabei kannst Du mit Roberts Vorschlag für ToString() genau das vorbereiten, was Du erreichen willst.

        Außerdem habe ich eine Klasse FieldAttributes erstellt...
        Ich sehe sie nicht und verstehe auch nicht, wozu sie gut sein soll.

        In den Sätzen sind nun alle Felder drin die benötigt werden und auch natürlich das jeweilige Format wieviele Zeichen dieses Feld enthält.
        Das ist durchaus sinnvoll. Man kann darüber streiten, ob die Maximallängen hier eingetragen werden sollen (und nicht nur Teil der Formatierung sind); aber das ist nebensächlich.

        Das Hauptprogramm kopiere ich dann jetzt mal.. ich dachte nur vielleicht mach ich mich damit unbeliebt hier so viel Code reinzusetzen.
        Stimmt, zumal das entscheidende Problem in Deinem Code immer noch nicht zu sehen ist: Was wird durch sw.Write(satze) gemacht?

        Die SDK-Doku sagt, dass durch StreamWriter.Write(object) die Methode ToString() des Objekts ausgewertet wird. Also musst Du - wenn Du so arbeiten willst - diese Methode in Deinen A/C/E-Klassen überschreiben; und damit sind wir wieder bei Roberts Vorschlag.

        Für das Erzeugen dieses Strings empfehle ich erneut dringend String.Format(). Mit den numerischen Argumenten kommen Leerzeichen "dazwischen" und am Ende der Teilsätze immer in der richtigen Anzahl hin, und Dein (entschuldige, seltsamer) "Leerzeichenbuilder" kann endgültig entfallen.

        Zusammenfassung: Ich halte es für besser, alles am Stück im Arbeitsspeicher zu verarbeiten und in einem Vorgang zu speichern; ich würde deshalb eine Oberklasse DTAusFile mit den Teilklassen A,C,E und eigener Read/Write-Methode bevorzugen (in der Art, wie ich es in meinem ersten Beitrag gemacht hatte). Die Klassen A,C,E entsprechen natürlich Deinen Klassen. Du kannst aber ohne Weiteres Dein Verfahren fortsetzen und musst lediglich die sw.Write-Methode durch ein passendes A.ToString() usw. ergänzen.

        Ich hoffe, ich konnte helfen. Jürgen

        Comment


        • #5
          danke läuft soweit

          Comment


          • #6
            Originally posted by TEXTiX-X View Post
            danke läuft soweit
            Ach ja, wie schön für Dich...

            Aus Höflichkeit gegenüber den Helfern und wegen des Nutzens für andere, die diese Diskussion lesen, hätte ich es begrüßt, wenn Du die von Dir verwendete Lösung zumindest kurz skizziert hättest (noch besser wäre, den verwendeten Code vorzustellen). Jürgen

            Comment


            • #7
              Originally posted by Jürgen Thomas View Post
              Ach ja, wie schön für Dich...

              Aus Höflichkeit gegenüber den Helfern und wegen des Nutzens für andere, die diese Diskussion lesen, hätte ich es begrüßt, wenn Du die von Dir verwendete Lösung zumindest kurz skizziert hättest (noch besser wäre, den verwendeten Code vorzustellen). Jürgen
              Diesen Kommentar halte ich auch nicht für besonders höflich... Ich denke nicht jeder neue weiß das das so Gang und Gebe ist.... Nur als Info, aber danke für den Hinweis und die Hilfe

              Comment


              • #8
                Hallo Leute.. Ich habe ein klitzekleines Problem.... Ich habe dieses File was nun generiert wird einfach mal versucht hochzuladen bei der Sparkasse.. deis wirft mir nun aus, dass es nicht korrekt ist. Ich hab dann in einem Binäreditor herausgefunden, dass das irgendwie nicht richtig encoded wird.... es entstehen bytes die nicht da hin gehören... was kann ich da machen???

                Comment


                • #9
                  Originally posted by TEXTiX-X View Post
                  deis wirft mir nun aus, dass es nicht korrekt ist. Ich hab dann in einem Binäreditor herausgefunden, dass das irgendwie nicht richtig encoded wird.... es entstehen bytes die nicht da hin gehören... was kann ich da machen???
                  Zunächst mal die Bytes angeben, die nicht passen, und was eigentlich gewünscht wird. Wir müssen doch nicht raten...

                  Höchstwahrscheinlich ist Encoding.ASCII falsch, weil das nur 7 Bit verarbeitet. Mit Encoding.GetEncoding(850) liegst Du vermutlich richtig; sonst probieren. Jürgen

                  Comment


                  • #10
                    Ich hatte in einem DTA-PDF gelesen es müsse ASCII-Format (ungepackt) haben.

                    deshalb wunder ich mich... Mit ASCII setzt er direkt zu Beginn 3 bytes (wirkt wie ein Bytemark) und zu ende jedes C-Satzes 1 Byte und natürlich bei den Umlauten.

                    Comment


                    • #11
                      Tja, das ist eines der Probleme, wenn nicht genau gesagt wird, was gemeint ist. ASCII gibt es mit 7 Bit und mit 8 Bit. Das DTAUS-Format geht (jedenfalls im Prinzip) mit beiden Varianten. Unter NET verarbeitet Encoding.ASCII aber eindeutig nur 7 Bit. Das 8-Bit-Ascii entspricht Encoding 850 oder 437, deshalb mein Vorschlag.

                      Die zusätzlichen Bytes kann ich mir nicht direkt erklären. Das hängt wahrscheinlich damit zusammen, wie NET beim StreamWriter die Encodings berücksichtigt.

                      Notfalls ist eine der anderen Speicher-Möglichkeiten besser geeignet: WriteAllText oder StringWriter. Jürgen

                      Comment


                      • #12
                        Danke.. Ich werd's mal ausprobieren.... Oh man... und ich dachte das das Programm so an sich gt geschrieben wäre und fertig.. aber man kann sich nicht mal darauf verlassen was man im Normalmodus sieht..... es muss auch noch binär total korrekt sein -.-

                        Comment


                        • #13
                          So hab es herausgefunden was falsch war.... der C-Satz benötigt tatsäch ein anderes Format.... Wikipedia ist leider nicht aktuell als Quelle...
                          Dies ist nun die richtige Klasse:

                          Code:
                          using System;
                          using System.Collections.Generic;
                          using System.Text;
                          
                          namespace WRITE_DTA
                          {
                              class C_Satz
                              {
                          
                                  [FieldAttribute(FieldSize = 4, Description = "0187")]
                                  public string Satzlaenge = "0187";
                          
                                  [FieldAttribute(FieldSize = 1, Description = "C")]
                                  public string Satzart = "C";
                          
                                  [FieldAttribute(FieldSize = 8, Description = "BLZ-Empfaenger", IsNumeric = true)]
                                  public string BLZ_Empfaenger;
                          
                                  [FieldAttribute(FieldSize = 8, Description = "BLZ-Sender", IsNumeric = true)]
                                  public string BLZ_Sender;
                          
                                  [FieldAttribute(FieldSize = 10, Description = "Kontonummer", IsNumeric = true)]
                                  public string Kontonummer;
                          
                                  [FieldAttribute(FieldSize = 13, Description = "0000000000000")]
                                  public string Leerzeichen_a_4 = new string('0', 13);
                          
                                  [FieldAttribute(FieldSize = 2, Description = "04=Abbuchung 05=Einzug 51=ueberweisung 53=Gehalt 54=Vermoegenwirksame Leistungen 56=oeffentliche Kassen")]
                                  public string Textschluessel;
                          
                                  [FieldAttribute(FieldSize = 3, Description = "000")]
                                  public string Nullen_2 = new string('0', 3);
                          
                                  [FieldAttribute(FieldSize = 1, Description = "Leerzeichen_a_1")]
                                  public string Leerzeichen_a_1 = new string(' ', 1);
                          
                                  [FieldAttribute(FieldSize = 11, Description = "00000000000")]
                                  public string Nullen_c_11 = new string('0', 11);
                          
                                  [FieldAttribute(FieldSize = 8, Description = "BLZ-Empfaenger", IsNumeric = true)]
                                  public string BLZ_Empfaenger_C;
                          
                                  [FieldAttribute(FieldSize = 10, Description = "Kontonummer-Empfaenger", IsNumeric = true)]
                                  public string Kontonummer_Empfaenger;
                          
                                  [FieldAttribute(FieldSize = 11, Description = "Betrag", IsNumeric = true)]
                                  public string Betrag;
                          
                                  [FieldAttribute(FieldSize = 3, Description = "Leerzeichen_a_3")]
                                  public string Leerzeichen_c_3 = new string(' ', 3);
                          
                                  [FieldAttribute(FieldSize = 27, Description = "Name Absender")]
                                  public string Name_Absender;
                          
                                  [FieldAttribute(FieldSize = 8, Description = "Leerzeichen_a_8")]
                                  public string Leerzeichen_c_8 = new string(' ', 8);
                          
                                  [FieldAttribute(FieldSize = 27, Description = "Name_Beguenstigter")]
                                  public string Name_Beguenstigter;
                          
                                  [FieldAttribute(FieldSize = 27, Description = "Verwendungszweck")]
                                  public string Verwendungszweck;
                          
                                  [FieldAttribute(FieldSize = 1, Description = "1 = Euro")]
                                  public string Waehrung = "1";
                          
                                  [FieldAttribute(FieldSize = 2, Description = "Leerzeichen_a_2")]
                                  public string Leerzeichen_a_2 = new string (' ', 2);
                          
                                  [FieldAttribute(FieldSize = 2, Description = "Nullen_a_2")]
                                  public string Nullen_a_2 = new string('0', 2);
                          
                                  [FieldAttribute(FieldSize = 67, Description = "Erweiterungszeichen_a_67")]
                                  public string Erweiterungszeichen_a_67 = new string(' ', 67);
                          
                                  [FieldAttribute(FieldSize = 1, Description = "Leerzeichen_a_1")]
                                  public string Leerzeichen_c_1 = new string(' ', 1);
                          
                                  [FieldAttribute(FieldSize = 1, Description = "Endzeichen")]
                                  public string Endzeichen = new string(' ', 1);
                          
                              }
                          }
                          außerdem hat mir das getEncoding(28591) weitergeholfen....



                          danke für den Support...

                          Comment


                          • #14
                            Originally posted by TEXTiX-X View Post
                            So hab es herausgefunden was falsch war.... der C-Satz benötigt tatsäch ein anderes Format.... Wikipedia ist leider nicht aktuell als Quelle...
                            Nun ja, es sollte doch bekannt sein, dass Wikipedia als allgemeine Informationsquelle sehr hilfreich ist; aber wenn es um "amtliche" Festlegungen geht, muss man sich auf jeden Fall an die amtlichen Stellen handeln. Das sind in diesem Fall die Banken.
                            Originally posted by TEXTiX-X View Post
                            außerdem hat mir das getEncoding(28591) weitergeholfen....
                            Dringende Warnung: Lass' das erst von Deiner Bank bestätigen. 28591 entspricht ISO-8859-1 (wie in der SDK-Doku nachzulesen ist), also einem Windows-ANSI. Die Bank-Computer dürften aber mit einem DOS-ANSI arbeiten, also (wie vorgeschlagen) mit 850 oder 437 o.ä.

                            Jürgen

                            Comment


                            • #15
                              hhmmmm Ich kann's nochmal direkt bei der Bank abfragen, aber bei 850 und 437 schmiss der mir nen fehler raus...

                              Comment

                              Working...
                              X