Announcement

Collapse
No announcement yet.

Einträge in textdatei schreiben C#

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

  • Einträge in textdatei schreiben C#

    Hallo,

    ich möchte in C# ein Textdatei erstellen und zeile, die so aussehen in Textdatei schreiben.
    Code:
    300;83;4027671000005;4024391000001;2015-24323;176,79;;;;-22,24;;;;;0;154,55;7;10,82;165,37;165,37;
    310;83;4027671000005;4024391000001;2015-24323;7;ADR;176,79;7;-12,38;1;Stufe 1
    310;83;4027671000005;4024391000001;2015-24323;7;ADR;164,4147;6;-9,864882;1;Stufe 4
    400;83;4027671000005;4024391000001;2015-24323;176,79;-22,24;;;;;;154,55;10,82;165,37;;165,37;165,37;
    Die Zeile, die im Texdatei geschrieben werden, sollten folgende StrukturMerkmale haben.
    Code:
    1_ Es werden CSV-Records (Comma Separated Values) mit variabler Feldlänge unterstützt. Feldtrenner ist ein Semikolon. Jedes Feld wird durch ein Semikolon abgeschlossen.
    
    2_Innerhalb eines Feldes ist ein Semikolon nicht Zulässig
    
    3_Liegen für ein Feld keine Daten vor, so wird ein leeres Feld durch ein trennzeichen(semikolon) symbolisiert
    
    4_Jede auch die Letzte Zeile muss ein CRLF (Enter) abgeschlossen sein
    
    5_Jede Zeile darf genau ein Segment enthalten (Z.B die ziffer 300; 310; 100;400 (Feldlänge 3))
    
    6_jede Segment muss am Segment-Anfang durch einen eideutigen Kennzeichner gekennzeichnet sein
    
    7_Das Dezimalzeichen für Beträge ist ein Komma, tausender Trennzeichen sind nicht zulässig
    
    8_Negative Werte werden mit Vorzeichen '-'gekennzeichnet.
    hat jemand ein beispiel code in C# für diese aufgabe oder ein ähnliche Thema?

    so habe ich angefangen
    Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.IO;
    
    namespace TextdateiErstellen
    {
        class Textdatei
        {
            static void Main(string[] args)
            {
                string filePath = @"C:\Projekte\TextdateiErstellen\test.txt";
                List<string> lines = new List<string>();
                
                File.WriteAllLines(filePath, lines, Encoding.ASCII);
            }
        }
    }
    Ich Danke Ihnen im vorraus für Ihre Hilfe
    Lg

  • #2
    Was ist die Frage?
    Offenbar hast du doch schon herausbekommen, wie man Zeilen in eine Datei schreibt.
    Wo ist jetzt das Problem "lines" mit Werten zu versehen?
    Christian

    Comment


    • #3
      Hallo Christian,
      Dankeschön für die schnelle Antwort
      Ja meine Frage ist "Lines" mit Werte zu verstehen.
      Danke im voraus
      Lg

      Comment


      • #4
        Mit den infos von dir bleibt nur:

        lines.Add("300;83;4027671000005;4024391000001;2015-24323;176,79;;;;-22,24;;;;;0;154,55;7;10,82;165,37;165,37;");

        Wobei 5 und 6 als widersprüchlich zu einer CSV-Datei erscheinen.

        Sofern gemeint ist, dass du die Zeile lesen und alle Werte einzeln wegspeichern sollst, schau dir

        https://msdn.microsoft.com/de-de/lib...VS.110%29.aspx

        an und splitte den CSV-String anhand des ; auf. Jeder Wert wird dann in lines eingefügt und zum Schluß geschrieben. Was dann Nr. 6 bedeuten soll, müsstest du erläutern
        Zuletzt editiert von Christian Marquardt; 07.08.2015, 05:53.
        Christian

        Comment


        • #5
          Guten Morgen,

          ich sollte eine ASCII-Schnittstelle in c# programmieren. diese Ascii schnittstelle ermöglicht den Datenaustausch zwischen 2 Systemen. Die ASCII- schnittestelle sollte die ASCii dateien vom den Datenbank übernehmen und in der Textdatei schreiben.

          Für ASCII-Dateien, die Zwischen der Datenbank und meine Textedatei ausgetauscht werden, werden die Struckturmerkmale oben (erste thread) für die Ascii schnittstelle vorausgesetzt.

          ich weiss nicht, ob das "problem" gut erläutern ist. Bitte hat jemand vielleicht ein bsp code für Ascii schnittstelle in C#. oder könnte man mir sagen wo ich anfangen muss.

          Ich habe keine Ahnung, wie ich das machen sollte.

          Vielen Dank im voraus für Ihre Hilfe

          Lg

          Comment


          • #6
            "Encoding.ASCII" bedeutet: Eine Codierung für den ASCII-Zeichensatz (7 Bits). ASCII-Zeichen sind auf die 128 niedrigsten Unicode-Zeichen zwischen U+0000 und U+007F begrenzt.

            Dein Text enthält Wörter in Deutsch, falls da Umlaute vorkommen wird das Ergebnis vermutlich nicht so aussehen wie erhofft.

            Gruss

            Comment


            • #7
              Hallo,

              Ich habe folgende code geschrieben. Ich möchte die Information von der 3 functions "Kopfsegment" "adresssegment" und "positionsegment" in Main () übergeben. in String Line zuweisen.
              Code:
              using System;
              using System.Collections.Generic;
              using System.Linq;
              using System.Text;
              using System.Threading.Tasks;
              using System.IO;
              using System.Diagnostics;
              using System.Reflection;
              using System.Data.SqlClient;
              
              namespace test
              {
                  class Textdatei
                  {
                      public static string KopfSegment (int segmentkennzeichner, int DokumentArt, long Lieferant, long RechnungEmpfänger, int Rechnungsnummer, DateTime Lieferantendatum, string Käufer)
                      {
                          int Seg;
                          int Dok;
                          long Lie;
                          long RechEmpf;
                          int RechNum;
                          DateTime LfDatum;
                          String Kf;
                          Seg = segmentkennzeichner;
                          Dok = DokumentArt;
                          Lie = Lieferant;
                          RechEmpf = RechnungEmpfänger;
                          RechNum = Rechnungsnummer;
                          LfDatum = Lieferantendatum;
                          Kf = Käufer;
              
                          segmentkennzeichner = 100;
                          DokumentArt = 83;
                          Lieferant = 4027671000005;
                          RechnungEmpfänger = 4024391000001;
                          Rechnungsnummer = 2015 - 24323;
                          //Lieferantendatum = 03.08.2015;
                          Käufer = "Soft";
                          return KopfSegment;
                      }
              
                      public static string Adressegment(int segmentkennzeichner, int DokumentArt, long Lieferant, long RechnungEmpfänger, int Rechnungsnummer,string  Adressart, double Postleitzahl)
                      {
                        
                          segmentkennzeichner = 120;
                          DokumentArt = 83;
                          Lieferant = 4027671000005;
                          RechnungEmpfänger = 4024391000001;
                          Rechnungsnummer = 2015 - 24323;
                          //Lieferantendatum = 03.08.2015;
                          Adressart = "ADR";
                          return Adressegment;
                      }
              
                      public static string Positionsegment(int segmentkennzeichner, int DokumentArt, long Lieferant, long RechnungEmpfänger, int Rechnungsnummer, string Textart, int Textschlüssel)
                      {
                          
                          segmentkennzeichner = 300;
                          DokumentArt = 83;
                          Lieferant = 4027671000005;
                          RechnungEmpfänger = 4024391000001;
                          Rechnungsnummer = 2015 - 24323;
                          Textart = "Blau";
                          return Positionsegment;
                      }
              
              
                      static void Main(string[] args)
                      {
                          string Textdatei = @"C:\Projekte\Ascii_Schnittstelle\test.txt";
              
                          string line = ; // information von Kopfsegment, positionsegment und addresssegment hier übergeben
                          File.WriteAllLines(Textdatei,Line, Encoding.ASCII);
              
                         
                       
                      }
                  }
              }
              so dass am Ende in der Texdatei die Zeile so aussehen
              Code:
              100;83;4027671000005;4024391000001;2015 – 24323;"Soft"
              120;83;4027671000005;4024391000001;= 2015 - 24323;"ADR";
              300;83;4027671000005;4024391000001;2015 - 24323;"Blau";
              kann mir Jemand den code ergänzen?

              Danke

              Comment


              • #8
                Ehrlich gesagt sieht das nicht danach aus als hättest du den Code geschrieben. Das sieht eher nach Übungscode aus den jemand anderes geschrieben hat und du must nur die nötigen Änderungen vornehmen damit es das tut was gewünscht ist. Und wie das bei Übungscode so ist, es ist nur eine Übung wenn man es selbst macht. Also probier dich an der Lösung und wenn du daran scheiterst stelle uns dazu eine konkrete Frage.

                Comment


                • #9
                  Hallo, ich habe für den Beispiel Positionsegment ergänzen
                  Code:
                   public static string Positionsegment(int segmentkennzeichner, int DokumentArt, long Lieferant, long RechnungEmpfänger, int Rechnungsnummer, string Textart, int Textschluessel)
                          {
                              
                              segmentkennzeichner = 300;
                              DokumentArt = 83;
                              Lieferant = 4027671000005;
                              RechnungEmpfänger = 4024391000001;
                              Rechnungsnummer = 2015 - 24323;
                              Textart = "Blau";
                              return string.Format("{0};{1};{2};{3};{4};{5};{6};", segmentkennzeichner, DokumentArt,  Lieferant, RechnungEmpfänger, Rechnungsnummer,
                                 Textart == null ? string.Empty : Textart, Textschluessel); 
                              //return Positionsegment;
                          }
                  
                  
                          static void Main(string[] args)
                          {
                              string Textdatei = @"C:\Projekte\Ascii_Schnittstelle\test.txt";
                              Positionsegment(300, 83, 4027671000005, 4024391000001, 2015 - 24323, blau, 0);
                              string[] stringSeparators = new string[] { ";" };
                              string[] result;
                              result = Positionsegment.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);
                  
                  
                              string line = Positionsegment(300, 83, 4027671000005, 4024391000001, 2015 - 24323, blau, 0); ; // information von Kopfsegment, positionsegment und addresssegment hier übergeben
                              File.WriteAllLines(Textdatei,Line, Encoding.ASCII);
                  Frage:
                  in Main function, wie übergebe ich die Parameter von PositionSegment an String Line, damit diese mit Semikolon zwischen die Parameter an textdatei gespeichert wird?
                  danke

                  Comment


                  • #10
                    Du meinst wie du die 3 strings die aus den Positionsegment, Adressegment, KopfSegment Methoden rauskommen verbindest?
                    Z.B. genauso wie du es in den 3 Methoden machst indem du für die 3 strings über einen ebnso gestalteten string.Format aufruf zuzammenfügst und line zuweist.

                    Dein code ist so schwer verständlich. Wenn du Code zeigst zeige ihn soweit möglich in einer kompilierbaren Weise. Hier hast du z.B. eine line Variable benutzt aber später Line, einmal benutzt du Positionsegment wie eine Methode dann wie eine Variable und rufst split daran auf. Das ist schwer durchschaubar. Wobei der Teil mit dem Split überflüssig ist du willst ja zusammenfügen (join) nicht aufteilen (split).

                    Comment


                    • #11
                      Hallo Ralf,
                      ich habe folgende Vorschlag von jemanden für die Lösung meinen Projekt bekommen
                      ich vermute mal das es dir nach wie vor darum geht CSV Dateien zu erstellen. Leider bringt dir dein Code nicht wirklich etwas.

                      Mein Ansatz war (nochmal zur Erinnerung) für eine Zeile eine Klasse zu erstellen die sämtliche Daten in Form von Eigenschaften aufnimmt. Von dieser erstellst du dann eine Liste und schreibst die Daten formatiert in eine CSV Datei.

                      Das erste was du ändern musst sind die Statischen Methoden. Entweder geben diese einzelne Datensätze zurück die du im inneren Instanziiert hast oder aber du tauschst diese gegen Konstruktor(Überladungen) aus. Weiterhin solltest du die Klasse "Textdatei" umbenannen, da das keine Datei sondern nur eine einzelne Zeile ist.

                      Anschließend kannst du dann eine Liste von dieser Klasse erstellen und dort einzelne Instanzen anhängen um sie am Ende (in einer Schleife) in eine Datei zu schreiben.
                      Ich habe versuch die Schritte zu machen.

                      vorschlag: Für eine Zeile eine Klasse zu erstellen und von dieser eine Liste erstellen
                      Code:
                      namespace Schnittstelle
                      {
                          public class Kopfsegement
                          {
                              public int segmentkennzeichner { get; set; }
                              public int DokumentArt { get; set; }
                              public long Lieferant { get; set; }
                              public long RechnungEmpfänger { get; set; }
                              public int Rechnungsnummer { get; set; }
                              public string Käufer { get; set; }
                              public Kopfsegement( int Seg,int Dok,long Lie,long RechEmpf,int RechNum,String Kf)
                              {
                                 segmentkennzeichner = Seg;
                                 DokumentArt = Dok;
                                 Lieferant = Lie;
                                 RechnungEmpfänger = RechEmpf;
                                 Rechnungsnummer = RechNum;
                                  Käufer = Kf;
                              }
                          } // Kopfsegement
                      class Program
                          {
                              IList<Kopfsegement> NCC_Kopfsegment;
                            //NCC_Kopfsegment = new List<Kopfsegement>();
                            NCC_Kopfsegment.Add(new Kopfsegement(100, 83, 4027671000005, 4024391000001,2015 - 24323,"Soft"));
                      ich bekomme bei dieser zeile folgende Fehler.
                      Code:
                      NCC_Kopfsegment.Add(new Kopfsegement(100, 83, 4027671000005, 4024391000001,2015 - 24323,"Soft"));
                      
                      Fehler	1	Ungültiges Token "(" in Klasse, Struktur oder Schnittstellenmemberdeklaration.	
                      
                      Fehler	2	Die Methode muss einen Rückgabetyp besitzen.	
                      
                      Fehler	3	Typ erwartet.	
                      
                      Fehler	4	"Schnittstelle.Program.NCC_Kopfsegment" ist ein(e) "Feld", wird aber wie ein(e) "Typ" verwendet.
                      Vorschlag :schreibst die Daten formatiert in eine CSV Datei

                      Vorschlag :Anschließend kannst du dann eine Liste von dieser Klasse erstellen und dort einzelne Instanzen anhängen um sie am Ende (in einer Schleife) in eine Datei zu schreiben.

                      wie mache ich die beide Vorschäge? Auf http://www.codeproject.com/Articles/...alizer-for-NET habe ich ein Beispiel wie man einen CSV-Serializer bauen kann.
                      hier mein gesamtProgramm
                      Code:
                      using System;
                      using System.Collections.Generic;
                      using System.Linq;
                      using System.Text;
                      using System.Threading.Tasks;
                      using System.IO;
                      using System.Reflection;
                      
                      namespace Schnittstelle
                      {
                          public class Kopfsegement
                          {
                              public int segmentkennzeichner { get; set; }
                              public int DokumentArt { get; set; }
                              public long Lieferant { get; set; }
                              public long RechnungEmpfänger { get; set; }
                              public int Rechnungsnummer { get; set; }
                              public string Käufer { get; set; }
                              public Kopfsegement( int Seg,int Dok,long Lie,long RechEmpf,int RechNum,String Kf)
                              {
                                 segmentkennzeichner = Seg;
                                 DokumentArt = Dok;
                                 Lieferant = Lie;
                                 RechnungEmpfänger = RechEmpf;
                                 Rechnungsnummer = RechNum;
                                  Käufer = Kf;
                              }
                          } // Kopfsegement
                      
                          public class Adresssegment
                          {
                              public int segmentkennzeichner { get; set; }
                              public int DokumentArt { get; set; }
                              public long Lieferant { get; set; }
                              public long RechnungEmpfänger { get; set; }
                              public int Rechnungsnummer { get; set; }
                              public string Adressart { get; set; }
                              public Adresssegment( int Seg,int Dok,long Lie,long RechEmpf,int RechNum,String adressart)
                              {
                                 segmentkennzeichner = Seg;
                                 DokumentArt = Dok;
                                 Lieferant = Lie;
                                 RechnungEmpfänger = RechEmpf;
                                 Rechnungsnummer = RechNum;
                                  Adressart = adressart;
                              }
                          } // Adresssegment
                      
                          class Program
                          {
                              IList<Kopfsegement> NCC_Kopfsegment;
                            //NCC_Kopfsegment = new List<Kopfsegement>();
                            NCC_Kopfsegment.Add(new Kopfsegement(100, 83, 4027671000005, 4024391000001,2015 - 24323,"Soft"));
                      
                      
                              public class CsvSerializer<T> where T : class, new()
                              {
                                  public char Separator { get; set; }
                      
                                  public string Replacement { get; set; }
                      
                                  private List<PropertyInfo> _properties;
                      
                                  public void Serialize(Stream stream, IList<T> data) { }
                      
                                  public IList<T> Deserialize(Stream stream) { }
                      
                      
                      
                                  public CsvSerializer()
                                  {
                                      var type = typeof(T);
                      
                                      var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance
                                           | BindingFlags.GetProperty | BindingFlags.SetProperty);
                      
                                      _properties = (from a in properties
                                                     where a.GetCustomAttribute<CsvIgnoreAttribute>() == null
                                                     orderby a.Name
                                                     select a).ToList();
                                  }
                                  public class CsvIgnoreAttribute : Attribute { }
                      
                                  private string GetHeader()
                                  {
                                      var columns = Properties.Select(a => a.Name).ToArray();
                                      var header = string.Join(Separator.ToString(), columns);
                                      return header;
                                  }
                      
                                  public void Serialize(Stream stream, IList<T> data)
                                  {
                                      var sb = new StringBuilder();
                                      var values = new List<string>();
                      
                                      sb.AppendLine(GetHeader());
                      
                                      var row = 1;
                                      foreach (var item in data)
                                      {
                                          values.Clear();
                      
                                          foreach (var p in _properties)
                                          {
                                              var raw = p.GetValue(item);
                                              var value = raw == null ?
                                                          "" :
                                                          raw.ToString().Replace(Separator.ToString(), Replacement);
                                              values.Add(value);
                                          }
                                          sb.AppendLine(string.Join(Separator.ToString(), values.ToArray()));
                                      }
                      
                                      using (var sw = new StreamWriter(stream))
                                      {
                                          sw.Write(sb.ToString().Trim());
                                      }
                                  }
                                  public IList<T> Deserialize(Stream stream)
                                  {
                                      string[] columns;
                                      string[] rows;
                      
                                      try
                                      {
                                          using (var sr = new StreamReader(stream))
                                          {
                                              columns = sr.ReadLine().Split(Separator);
                                              rows = sr.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
                                          }
                                      }
                                      catch (Exception ex)
                                      {
                                          throw new InvalidCsvFormatException(
                                                  "The CSV File is Invalid. See Inner Exception for more inoformation.", ex);
                                      }
                      
                                      var data = new List<T>();
                                      for (int row = 0; row < rows.Length; row++)
                                      {
                                          var line = rows[row];
                                          if (string.IsNullOrWhiteSpace(line))
                                          {
                                              throw new InvalidCsvFormatException(string.Format(
                                                      @"Error: Empty line at line number: {0}", row));
                                          }
                      
                                          var parts = line.Split(Separator);
                      
                                          var datum = new T();
                                          for (int i = 0; i < parts.Length; i++)
                                          {
                                              var value = parts[i];
                                              var column = columns[i];
                      
                                              value = value.Replace(Replacement, Separator.ToString());
                      
                                              var p = _properties.First(a => a.Name == column);
                      
                                              var converter = TypeDescriptor.GetConverter(p.PropertyType);
                                              var convertedvalue = converter.ConvertFrom(value);
                      
                                              p.SetValue(datum, convertedvalue);
                                          }
                                          data.Add(datum);
                                      }
                                      return data;
                                  }
                              }
                      
                      
                      
                      
                      
                      
                              static void Main(string[] args)
                              {
                                  var data = GetPeople();
                                  using (var stream = new FileStream("persons.csv", FileMode.Create, FileAccess.Write))
                                  {
                                      var cs = new CsvSerializer<Person>();
                                      cs.Serialize(stream, data);
                                  }
                      
                                  IList<Person> data = null;
                                  using (var stream = new FileStream("persons.csv", FileMode.Open, FileAccess.Read))
                                  {
                                      var cs = new CsvSerializer<Person>();
                                      data = cs.Deserialize(stream);
                                  }
                              }
                          }
                      }
                      Danke im voraus

                      Comment


                      • #12
                        a.) die gezeigte Zeile mit deiner Erwähnung von Fehlern steht einfach in der Klasse. Code gehört immer zu einer Methode in der Klasse. In der Klasse selbst gehören nur Definitionen (Methoden, Felder, Properties etc.)
                        b.) IList hat keine Add Methode nur List hat eine. An NCC_Kopfsegment kannst du also nicht Add aufrufen da der Compiler nur weiß das das ein IList ist.Das im konkreten Code dahinter eine konkrete Klasse steck(List) die so eine Methode hat kann der Compiler nicht berücksichtigen (man könnte das an vielen Stellen ja auch geändert haben und an NCC_Kopfsegment hängt eine ander Klasse die IList kann aber keine List ist. Das einfachste wäre die Variable auch als List zu definieren und nicht als IList.
                        c.) Deine CsvSerializer klasse ist mehrfach kaputt. Entweder du hast die nur teilweise gezeigt und Unfug dazuprogrammiert (doppelte Serializ/Deserialize Methoden, der Zugriff auf Properties in GetHeader etc.) oder du solltest den nicht benutzen.

                        Wenn ich deinen Kenntnisstand richtig einschätze war dein vorheriger Ansatz ohne den CsvSerializer besser für dich geeignet. Vielleicht solltest du das erstmal ohne den CsvSerializer zuende bringen und wenn du dann was funktionierendes hast kannst du das immer noch auf diesen Serializer umstellen.

                        Comment


                        • #13
                          Hallo,
                          ich habe versuch ohne den CsvSerializer zuende zu bringen. den code
                          Code:
                          namespace Schnittstelle
                          {
                              public class Kopfsegment
                              {
                                  public int segmentkennzeichner { get; set; }
                                  public int DokumentArt { get; set; }
                                  public long Lieferant { get; set; }
                                  public long RechnungEmpfänger { get; set; }
                                  public int Rechnungsnummer { get; set; }
                                  public string Käufer { get; set; }
                                  public Kopfsegment( int Seg,int Dok,long Lie,long RechEmpf,int RechNum,String Kf)
                                  {
                                     segmentkennzeichner = Seg;
                                     DokumentArt = Dok;
                                     Lieferant = Lie;
                                     RechnungEmpfänger = RechEmpf;
                                     Rechnungsnummer = RechNum;
                                      Käufer = Kf;
                                     //return Kopfsegment.String() + ";"  +segmentkennzeichner.ToString() + ";" +DokumentArt.ToString() +";" +Lieferant.ToString() +";"+ RechnungEmpfänger.ToString()  +";" +Rechnungsnummer.ToString() +";" + Käufer.ToString() +";";
                                         //return string.Format("{0};{1};{2};{3};{4};{5};{6};", segmentkennzeichner, DokumentArt, Lieferant, RechnungEmpfänger, Rechnungsnummer, Käufer);
                                     
                                    
                                  }
                              } // Kopfsegement
                          
                              public class Adresssegment
                              {
                                  public int segmentkennzeichner { get; set; }
                                  public int DokumentArt { get; set; }
                                  public long Lieferant { get; set; }
                                  public long RechnungEmpfänger { get; set; }
                                  public int Rechnungsnummer { get; set; }
                                  public string Adressart { get; set; }
                                  public Adresssegment( int Seg,int Dok,long Lie,long RechEmpf,int RechNum,String adressart)
                                  {
                                     segmentkennzeichner = Seg;
                                     DokumentArt = Dok;
                                     Lieferant = Lie;
                                     RechnungEmpfänger = RechEmpf;
                                     Rechnungsnummer = RechNum;
                                      Adressart = adressart;
                                  }
                              } // Adresssegment
                          
                              class Program
                              {
                           static void Main(string[] args)
                                  {
                           List<Kopfsegment> NCC_Kopfsegment;
                                      NCC_Kopfsegment = null;
                                      NCC_Kopfsegment = new List<Kopfsegment>();
                                      NCC_Kopfsegment.Add(new Kopfsegment(100, 83, 4027671000005, 4024391000001, 2015 - 24323, "Soft"));
                          
                                      List<Adresssegment> NCC_Adresssegment;
                                      NCC_Adresssegment = null;
                                      NCC_Adresssegment = new List<Adresssegment>();
                                      NCC_Adresssegment.Add(new Adresssegment(120, 83, 4027671000005, 4024391000001, 2015 - 24323, "ADR"));
                          
                                      string path = @"C:\Projekte\Ascii_Schnittstelle\test.txt";
                                      if (!File.Exists(path))
                                      {
                                          System.IO.Directory.CreateDirectory(path);
                                      }
                          
                                      if (File.Exists(path))
                                      {              
                                          File.WriteAllText(path, string.Empty);
                                      }
                                      using (StreamWriter sw = new StreamWriter(path))
                                      {
                                          
                                           sw.WriteLine(NCC_Kopfsegment);
                                           sw.WriteLine(NCC_Adresssegment);
                          
                                        
                                      }
                          
                                     
                          }
                              }
                          Ich habe keine Fehler. aber in meiner TextDatei steht

                          Code:
                          System.Collections.Generic.List`1[Schnittstelle.Kopfsegment]
                          System.Collections.Generic.List`1[Schnittstelle.Adresssegment]
                          anstatt
                          Code:
                          100;83;4027671000005;4024391000001;2015 – 24323;"Soft"
                          120;83;4027671000005;4024391000001;2015 - 24323;"ADR";
                          was soll ich ändern damit die zeile in Textdatei mit der Formatierung gut geschrieben werden?
                          eine Zeile Formatiert in den Stream zu schreiben.
                          Danke
                          LG

                          Comment


                          • #14
                            sw.WriteLine(NCC_Kopfsegment);
                            WriteLine schreibt strings weg. Die Kopfsegment Klasse (genauso Adresssegment) ist aber kein string. Darum wird durch WriteLine intern die ToString Methode der Klasse aufgerufen. Jede Klasse hat die und wenn man die nicht überschreibt liefert die erstmal den Klassennamen wie du in der Ausgabe ja auch gezeigt bekommst. Also solltest du entweder

                            a.) ToString von Kopfsegment, Adresssegment überschreiben und eine String im gewünschten Format zurückliefern. Falls du nicht weiß wie man Methoden überschreibt in der verlinkten Hilfe von ToString ist ein entsprechendes Codebeispiel, halt nach dem Schlüsselwort override Ausschau. Da sollte etwas da drinstehen was du schon als Kommentar im Constructor als return Wert hast. Wenn du ToString überschreibst kann der WriteLine Aufruf so bleiben wie er jetzt ist. Oder

                            b.) persönlich bin der Meinung das ToString eine DebugMethode sein sollte die also den Inhalt einer Klasse in einem zum debuggen geeigneten Format anzeigt und nicht für eine relevante Programfunktion genutzt werden sollte. Also anstatt ToString zu überschreiben gib den Klassen einfach eine neue Methode (z.B. ToCsvString() ) und gib dort den entsprechend formatierten String zurück. Beim Aufruf von WriteLIne gibst du halt dann explizit diese Method an anstatt einfach nur die Klasse zu übergeben.

                            Comment


                            • #15
                              Hallo Ralf,
                              ich habe dein Option b.) mit "ToCsvString" gemacht
                              Code:
                              using System;
                              using System.Collections.Generic;
                              using System.Linq;
                              using System.Text;
                              using System.Threading.Tasks;
                              using System.IO;
                              using System.Reflection;
                              
                              namespace Schnittstelle
                              {
                                  public class Kopfsegment
                                  {
                                      public int segmentkennzeichner { get; set; }
                                      public int DokumentArt { get; set; }
                                      public long Lieferant { get; set; }
                                      public long RechnungEmpfänger { get; set; }
                                      public int Rechnungsnummer { get; set; }
                                      public string Käufer { get; set; }
                                      public Kopfsegment(int Seg, int Dok, long Lie, long RechEmpf, int RechNum, String Kf)
                                      {
                                          segmentkennzeichner = Seg;
                                          DokumentArt = Dok;
                                          Lieferant = Lie;
                                          RechnungEmpfänger = RechEmpf;
                                          Rechnungsnummer = RechNum;
                                          Käufer = Kf;
                                          //return Kopfsegment.String() + ";"  +segmentkennzeichner.ToString() + ";" +DokumentArt.ToString() +";" +Lieferant.ToString() +";"+ RechnungEmpfänger.ToString()  +";" +Rechnungsnummer.ToString() +";" + Käufer.ToString() +";";
                                          //return string.Format("{0};{1};{2};{3};{4};{5};{6};", segmentkennzeichner, DokumentArt, Lieferant, RechnungEmpfänger, Rechnungsnummer, Käufer);       
                                      }
                                      public string ToCsvString()
                                      {
                                          try
                                          {
                                              return string.Format("{0};{1};{2};{3};{4};{5};{6};", segmentkennzeichner, DokumentArt, Lieferant, RechnungEmpfänger, Rechnungsnummer, Käufer == null ? string.Empty : Käufer);
                              
                                          }
                              
                                          catch (Exception)
                                          {
                              
                                              throw;// ich bekomme an dieser Stelle die Fehler
                                          }
                              
                              
                              
                                      } // Kopfsegement
                              
                                      public class Adresssegment
                                      {
                                          public int segmentkennzeichner { get; set; }
                                          public int DokumentArt { get; set; }
                                          public long Lieferant { get; set; }
                                          public long RechnungEmpfänger { get; set; }
                                          public int Rechnungsnummer { get; set; }
                                          public string Adressart { get; set; }
                                          public Adresssegment(int Seg, int Dok, long Lie, long RechEmpf, int RechNum, String adressart)
                                          {
                                              segmentkennzeichner = Seg;
                                              DokumentArt = Dok;
                                              Lieferant = Lie;
                                              RechnungEmpfänger = RechEmpf;
                                              Rechnungsnummer = RechNum;
                                              Adressart = adressart;
                                          }
                                          public string ToCsvString()
                                          {
                                              return string.Format("{0};{1};{2};{3};{4};{5};{6};", segmentkennzeichner, DokumentArt, Lieferant, RechnungEmpfänger, Rechnungsnummer, Adressart == null ? string.Empty : Adressart);
                                          }
                                      } // Adresssegment
                              
                                      class Program
                                      {
                              
                                          static void Main(string[] args)
                                          {
                              
                                              List<Kopfsegment> NCC_Kopfsegment;
                                              NCC_Kopfsegment = null;
                                              NCC_Kopfsegment = new List<Kopfsegment>();
                                              NCC_Kopfsegment.Add(new Kopfsegment(100, 83, 4027671000005, 4024391000001, 2015 - 24323, "Soft"));
                              
                                              List<Adresssegment> NCC_Adresssegment;
                                              NCC_Adresssegment = null;
                                              NCC_Adresssegment = new List<Adresssegment>();
                                              NCC_Adresssegment.Add(new Adresssegment(120, 83, 4027671000005, 4024391000001, 2015 - 24323, "ADR"));
                              
                                              string path = @"C:\Projekte\Ascii_Schnittstelle\test.txt";
                              
                                              if (File.Exists(path))
                                              {
                                                  File.WriteAllText(path, string.Empty);
                                              }
                                              using (StreamWriter sw = new StreamWriter(path, true))
                                              {
                                                  string KA = string.Join(";", NCC_Kopfsegment.Select(x => x.Käufer));
                                                  string KS = string.Join(";", NCC_Kopfsegment);
                                                  string AS = string.Join(";", NCC_Adresssegment);
                                                  sw.WriteLine(KS);
                                                  sw.WriteLine(AS);
                                                  sw.WriteLine(KA);
                              
                                                  foreach (Kopfsegment ob in NCC_Kopfsegment)
                                                  {
                                                      sw.WriteLine(ob.ToCsvString());
                                                  }
                              
                                                  foreach (Adresssegment oc in NCC_Adresssegment)
                                                  {
                                                      sw.WriteLine(oc.ToCsvString());
                                                  }
                              
                                              }
                              
                              
                                          }
                                      }
                                  }
                              }
                              bei kompilierung bekomme ich Fehler in der Methode ToCsvString()
                              Code:
                               FormatException wurde nicht behandeln
                              Der Index, basierend auf 0 (null), muss größer als oder gleich Null sein, und kleiner als die Größe der Argumentenliste.
                              was ist bei meiner Formatierung falsch?
                              danke

                              Comment

                              Working...
                              X