Announcement

Collapse
No announcement yet.

Datei in anderem Zeichenformat speichern

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

  • Datei in anderem Zeichenformat speichern

    Hallo zusammen,

    ich baue mir gerade ein mini Tool mit dem ich eine Textdatei etwas umformatieren kann.

    Hier mal was ich bisher habe:

    Code:
    InitializeComponent();
                FileSystemWatcher FSW = new FileSystemWatcher();
                 // Pfad und Filter festlegen
                FSW.Path = @"C:\";
                FSW.Filter = "Kontakte.txt";
    
                // Events definieren
                FSW.Changed += new FileSystemEventHandler(FSW_Changed); 
                FSW.Created += new FileSystemEventHandler(FSW_Created); 
                FSW.Deleted += new FileSystemEventHandler(FSW_Deleted); 
                FSW.Renamed += new RenamedEventHandler(FSW_Renamed);
    
                // Filesystemwatcher aktivieren
                FSW.EnableRaisingEvents = true;
            }
            
            private void button1_Click(object sender, EventArgs e)
            {
                String value;
                StreamWriter myWriter = File.CreateText(@"c:\IMPORT.NMR");
                string szSrcLine;
                int zaehl = 0;
                FileStream fsInput = new FileStream("c:/Kontakte.txt", FileMode.Open, FileAccess.Read);
                StreamReader srInput = new StreamReader(fsInput, System.Text.Encoding.Default);
            
                while ((szSrcLine = srInput.ReadLine()) != null)
                {
                    szSrcLine = szSrcLine.Replace("\"", "");
                    szSrcLine = szSrcLine.Replace(",", "; "); 
                   
                    myWriter.WriteLine(szSrcLine, Encoding.Default);
                }
                srInput.Close();
                fsInput.Close();
                myWriter.Close();
                
            }
            // Handler für alle Events
            void FSW_Renamed(object sender, RenamedEventArgs e)
            {
                MessageBox.Show("Umbenannt: " + e.Name);
            }
    
            void FSW_Deleted(object sender, FileSystemEventArgs e)
            {
                MessageBox.Show("Gelöscht: " + e.Name);
            }
    
            void FSW_Created(object sender, FileSystemEventArgs e)
            {
                MessageBox.Show("Erstellt: " + e.Name);
            }
    
            void FSW_Changed(object sender, FileSystemEventArgs e)
            {
                MessageBox.Show("Geändert: " + e.Name);
            }
        }
    Aber egal was ich bisher probiert habe, meine Umlaute werden nicht so gespeichert dass ich die Textdatei hinterher mit unserem Emailprogramm (Tobit David) importieren kann ohne dass die Umlaute zerhackt werden.

    Wenn ich die Datei IMPORT.NMR hinterher mit dem Windows Editor öffne und dann als ANSI neu abspeicher, dann werden die Umlaute richtig dargestellt.

    ich habe schon alle encoding Einstellungen dieser beiden Zeilen durch und immer ein falsches Ergebnis.
    Code:
    myWriter.WriteLine(szSrcLine, false, Encoding.Default);
    
    StreamReader srInput = new StreamReader(fsInput, System.Text.Encoding.Default);
    Was muss ich machen, damit es auch ohne anschließendes speichern mit dem Editor geht?

    Gruß, Wolle

  • #2
    http://entwickler-forum.de/showthread.php?t=2864
    Bitte vergessen Sie nicht die Antwort zu bewerten. Danke.:-)

    Comment


    • #3
      Das löst mein Problem nicht wirklich.

      In beiden Datein sind die Umlaute enthalten nur kann werden Sie hinterher beim Inport in die fremde Software nicht richtig erkannt.

      Wenn ich die Ausgavedatei mit dem Windows Editor öffne und unter ANSI abspeicher funktioniert es allerdings mit dem Import reibungslos.

      Ich möchte nur diesen manuellen Schritt das Abspeichern in ANSI mit meinem Program automatisch erledigen ohne nachher noch den Windows Editor öffnen zu müssen.

      Das muss doch irgendwie machbar sein.

      Gruß, Wolle

      Comment


      • #4
        Ich möchte nur diesen manuellen Schritt das Abspeichern in ANSI mit meinem Program automatisch erledigen ohne nachher noch den Windows Editor öffnen zu müssen.
        Das hast du schon wenn du per Encoding.Default speicherst.

        Dein Problem ist vermutlich das lesen. Du musst die Datei auch im richtigen Encoding lesen(vermutlich errät Notepad das ursprüngliche Encoding zufällig richtig). Du musst also a.) die Datei im richtigen Encoding lesen und b.) diese dann im richtigen Encoding speichern. Da wir weder wissen in welchem Encoding deine 'Kontakte.txt' vorliegt noch welches Format den Tobit genau haben will können wir da nur raten.

        Comment


        • #5
          Hmm, wie gesagt.

          Die Umlaute sind sowohl in der Ursprungsdatei aus dem Adressenmanager vorhanden, sowie auch in der Datei die mit meinem Program erstellt wird.

          Ich öffne wie man an meinem Code sieht die Datei "Kontakte.txt" die sollte wenn ich mich nicht ganz Täusche im Windows Standard vorliegen. Deswegen öffne ich sie mit default.

          Dann erstelle ich die Datei "IMPORT.NMR" die ich später mit Tobit importieren möchte.

          Ich lösche dann einige Zeichen und tausche "," gegen "; " und dann wird das ganze in "IMPORT.NMR" gespeichert.

          Hier schreibt Tobit folgende Varianten vor:

          Als Standard wird beim Adressimport generell der OEM-Zeichensatz erwartet. Die Importdatei sollte also mit einem DOS-Editor erstellt werden. Ist das Erstellen mit einem Dos-Editor jedoch nicht möglich oder nicht erwünscht, kann auch ein Windows-Edoitor verwendet werden. In diesem Fall basieren die zu importierenden Daten auf dem ANSI-Zeichensatz, was in der Importdatei durch die zusätzliche Zeile [ANSI] zu kennzeichnen ist.
          Das mit dem einfügen der Zeile [ANSI] habe ich so gelößt, dass in der ursprünglichen Datei die Zeile [ANSI] eingefügt ist.

          Ist es jetzt ein wenig verständlicher?

          Gruß, Wolle

          Comment


          • #6
            Ist es jetzt ein wenig verständlicher?
            ANSI ist ein umgangssprachlicher Begriff. Es gibt keinen wirklichen ANSI Standard für Zeichenkodierungen! Wenn jemand von ANSI spricht kannst du nur von einer Definition der ersten 128 Zeichen ausgehen(also ohne Umlaute) die oberen 128 Zeichen sind abhängig von der eingestellten Codepage und das ganze ist damit systemabhängig und somit kann man auch kaum von einem Windowsstandard sprechen.

            Sind an deinem Vorgang mehrere Rechner beteiligt mit unterschiedlichen Codepage Einstellungen? Ist dein 'Kontakte.txt' wirklich ein ANSI ähnliches Dokument und nicht doch (weil mit einem aktuellen Editor erstellt) eher UTF-8?

            Comment


            • #7
              Wie gesagt, ich habe an dieser Stelle:

              StreamReader srInput = new StreamReader(fsInput, System.Text.Encoding.Default);

              bei Encoding schon alle Varianten probiert, auch UTF8, 7, 32 ASCII und unicode.

              Am Ergebnis ändert das aber nichts bzw. die Zeichen werden Zwar unterschiedlich dargestellt, aber leider immer falsch.

              Für den ganzen Vorgang wird nur ein Rechner genutzt.

              Wenn es über ANSI nicht geht, dann halt nicht, aber was ist mit:

              Als Standard wird beim Adressimport generell der OEM-Zeichensatz erwartet.

              Kann man das irgendwie bewerkstelligen?

              Gruß, Wolle

              Comment


              • #8
                OEM entspricht Codepage 437.
                Also solltest du die Datei mit Codepage 437 wegschreiben.

                Code:
                myWriter.WriteLine(szSrcLine, Encoding.GetEncoding(437));
                Aber solange du die Kontakte.txt nicht mit der richtigen Encoding Einstellung lädst (wenn sie den falsch ist) wird das nicht helfen.

                Comment


                • #9
                  Kannst Du dir bitte nochmal meinen Queltext anschauen?

                  Egal welche Eistellungen ich für Encoding für die Ausgabe einstelle, es wird immer nur eine Datei mit UTF8 erzeugt, ich muss aber definitiv OEM haben.

                  Beim Einlesen der Ursprungsdatei scheint alles OK zu sein, nur die Ausgabe ist immer das selbe Ergebnis, egal welchen Code ich einstelle.

                  Bestimmt habe ich irgendwo einen Fehler in der Reihenfolge oder so ähnlich.
                  Hab noch zu wenig Erfahrung mit c# um dahinter zu steigen.

                  Gruß, Wolle

                  [highlight=c#]private void button1_Click(object sender, EventArgs e)
                  {
                  String value;
                  StreamWriter myWriter = File.CreateText(@"c:\IMPORT.NMR");
                  string szSrcLine;
                  int zaehl = 0;
                  FileStream fsInput = new FileStream("c:/Kontakte.txt", FileMode.Open, FileAccess.Read);
                  StreamReader srInput = new StreamReader(fsInput, System.Text.Encoding.GetEncoding(1252));
                  while ((szSrcLine = srInput.ReadLine()) != null)
                  {
                  szSrcLine = szSrcLine.Replace("\"", "");
                  szSrcLine = szSrcLine.Replace(",", "; ");

                  myWriter.WriteLine(szSrcLine, false, Encoding.GetEncoding(437));
                  }
                  srInput.Close();
                  fsInput.Close();
                  myWriter.Close();

                  } [/highlight]
                  Zuletzt editiert von Ledge; 18.11.2009, 15:27.

                  Comment


                  • #10
                    Ah. Du hast Recht da ist was komisch.

                    StreamWriter.WriteLine hat keine Überladung dem man ein Encoding mitgeben kann.
                    Du hast eine Überladung erwischt die als dritten Parameter ein Object erwartet und eigentlich etwas anderes macht (in etwa entsprechend string.Format). Sorry, ich hatte einfach deinen Code genommen und passend geändert ohne zu überlegen ob das ursprünglich überhaupt möglich war.

                    Das festlegen des Encoding musst du über den Constructor des StreamWriters machen den erreichst du über File.CreateText nicht. Also selbst erzeugen

                    Code:
                    StreamWriter myWriter = new StreamWriter((@"c:\IMPORT.NMR", false, Encoding.GetEncoding(437));
                    und nachher WriteLine ohne Encoding aufrufen.

                    Code:
                    myWriter.WriteLine(szSrcLine);
                    PS. Woher hattest du die Info zu dieser Aufrufkonvention von WriteLine?

                    Comment


                    • #11
                      Puhh, lange Geburt.

                      Aber was lange währt, wird endlich gut.

                      Jetzt funktioniert es, ich hab schon gedacht ich bin bescheuert ^^.

                      PS. Woher hattest du die Info zu dieser Aufrufkonvention von WriteLine?
                      Hab danach gegoogeld und das kam dabei raus. Hatte auch schon selber versucht es so umzustellen aber dabei den Parameter False vergessen, da ging es natürlich auch nicht.


                      Ich danke Dir vielmals für deine fachkundige Hilfe.


                      Gruß, Wolle

                      Comment

                      Working...
                      X