Autor Beitrag
DeTomaso33
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52
Erhaltene Danke: 1

Windows10
C#,HTML,CSS3,Javascript
BeitragVerfasst: Mo 18.01.16 16:11 
Hallo Leute,

ich habe eine Konsoleanwendung geschrieben, die aus einer bestehenden Word-Datei ein xml-Dokument mit vorgegebenen Tags erzeugen soll. Das Splitting erfolgt am $-Zeichen,das ich extra in meine Testdatei vor demjeweiligen Inhalt eingefügt habe. Unerheblich dabei ist,dass ich vorher bei einem anderen Projekt eine Datei mit einer Liste hatte, in der Daten schön kurz zusammengefasst waren - hier sind jetzt die Textpassagen größer.
Mein Fehler, den ich auch nach Wechsel der Encoding-Art auf UTF8 erhalte,gibt in der foreach-Schleife beim "Thema" also s.Split ('$')[1] einen ArgumentException Fehler aus, den ich nicht verstehe. Es wird ein ungültiges Zeichen '.' in meinem Quellcode angegeben - mit dem Zusatz hexcode 0x00. Der '.' ist doch in UTF8 enthalten! Hier mein Code...

ausblenden volle Höhe C#-Quelltext
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:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.IO;

namespace XMLforTestserie
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var fileInfo = new FileInfo(@"C:\Users\T\Documents\Test-Serie.doc");
                string pfad = @"C:\Users\T\Documents\Test-Serie.doc";


                // Prüfen ob die Datei existiert
                if (File.Exists(pfad))
                {
                    List<string> liLines = new List<string>();
                    string path = Path.GetFullPath(pfad);
                    liLines.AddRange(System.IO.File.ReadAllLines(path, Encoding.UTF8));
                    string ausgabe = string.Empty;

                    using (XmlWriter writer = XmlWriter.Create(@"C:\Users\T\Documents\testserie1.xml"))
                    {
                        writer.WriteStartDocument();
                        writer.WriteStartElement("Dokument");

                        // Artikel müssen aus liLines geholt werden.
                        foreach (string s in liLines)
                        {
                            writer.WriteStartElement("Titel");

                            //Die gesplitteten Daten erhalten für die einzelnen xml-Elemente die gewünschten Tags.
                            writer.WriteElementString("THEMA", s.Split('$')[1]);
                            writer.WriteElementString("Modell", s.Split('$')[2]);
                            writer.WriteElementString("Abschnitt", s.Split('$')[3]);
                            writer.WriteElementString("Bildtitel", s.Split('$')[4]);
                            writer.WriteElementString("HINWEIS", s.Split('$')[5]);
                            writer.WriteElementString("Unterabschnitt1", s.Split('$')[6]);
                            writer.WriteElementString("Unterabschnitt2", s.Split('$')[7]);
                            writer.WriteElementString("Unterabschnitt3", s.Split('$')[8]);
                            writer.WriteElementString("Abschnitt", s.Split('$')[9]);
                            writer.WriteElementString("Unterabschnitt4", s.Split('$')[10]);
                            writer.WriteElementString("Unterabschnitt5", s.Split('$')[11]);
                            writer.WriteElementString("Unterabschnitt6", s.Split('$')[12]);
                            
                            writer.WriteEndElement();
                        }

                        writer.WriteEndElement();
                        writer.WriteEndDocument();
                    }

                }
                else
                {
                    Console.WriteLine("Die Datei Test-Serie.doc wurde nicht gefunden.");
                }
            }
            catch (IOException ex)
            {
                Console.WriteLine(ex);
            }
        }
    }
}

Danke vorab für die Beschäftigung mit der Problematik.
mfg
DeTomaso33

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 18.01.16 16:56 
Hallo,

liest du etwa eine binäre DOC-Datei (Word) mittels File.ReadAllLines ein???
Ist doch klar, daß der Inhalt dann Murks ist (kannst dir ja mal mit dem Debugger die Schleifen-Variable s anschauen)...

PS: Du solltest s.Split('$') auch nur einmal - aus Performance-Gründen - aufrufen, und nicht x-mal!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 18.01.16 17:11 
Dein doc Datei sollte eine csv mit $ als Trennzeichen sein kein MS Office Word richtig?

Zitat:
Es wird ein ungültiges Zeichen '.' in meinem Quellcode angegeben - mit dem Zusatz hexcode 0x00. Der '.' ist doch in UTF8 enthalten


doc ist ein binär Format. Da kannst du nicht einfach klarText rauslesen. Unter anderem enthält so eine doc eben auch schonmal den Wert 0x00 was ein gültiger Binarwert ist aber eben kein gültiges utf-8 Zeichen. Da es kein gültiges Zeichen ist und daher auch nicht anzeigbar ist der '.' nur ein Platzhalter für 'nicht anzeigbar'.
DeTomaso33 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52
Erhaltene Danke: 1

Windows10
C#,HTML,CSS3,Javascript
BeitragVerfasst: Di 19.01.16 16:01 
Hi Th69,

hier jetzt die öffentliche Weiterführung des Themas gleichen Inhalts. Ich kenne den Aufruf für das Splitting nur in der Kombination von Tag und dazugehörigem Splittingabschnitt, der durch den Klammerausdruck [2],[3]oder [7] ausgewählt wird. Wenn Du mir einen Hinweis geben könntest, wie Deine verkürzte Form aussieht, wäre das echt nett und erspart mir langes Suchen.

Wie ich durch nachlesen bei Microsoft herausgefunden habe, dient das 'ReadAllLines' dem Erzeugen,Einlesen und Schließen einer Datei. Da liege ich eigentlich richtig. Nur mit dem einlesen des Binärcodes habe ich meine Probleme (war mir mit Binärdatei erst nicht sicher, da der Text als WordText Version 2003-2007 vorliegt, aber die Fehlermeldung läßt logisch darauf schließen). Wenn ich nach meinem Encoding den Punkt setze, erhalte ich von der Intellisense die Erweiterungen ASCII, BigEndianUnicode,Default, Unicode und UTF7,8 oder 32 als Auswahl. Ich habe alle einmal ausprobiert, aber der Fehler bleibt immer die Eingangs erwähnte ArgumentException (s.Anhang). Was ist ratsam ?

mfg
DeTomaso33
Einloggen, um Attachments anzusehen!
DeTomaso33 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52
Erhaltene Danke: 1

Windows10
C#,HTML,CSS3,Javascript
BeitragVerfasst: Di 19.01.16 16:22 
Hi,
bin's nochmal! Der Inhalt von s ist wirklich Murks bzw.nur Null-Einträge (s.Anhang). Ich habe eigentlich jemanden, den ich so Fragen kann,wenn es ein Problem gibt, aber manchmal hat derjenige keine Zeit oder ist auch überfragt trotz größerer Erfahrung. Eine erfahrene Programmiererin (mehr als 10Jahre) sagte mal: "Man hat eigentlich nie richtig Routine im Programmieren!" und das scheint auch so zu stimmen. Danke nochmal fürs Weiterhelfen!

mfg
DeTomaso33
Einloggen, um Attachments anzusehen!
tomte
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19
Erhaltene Danke: 5

Win 7, Win 8.1, Win 10, Win Server 2012

BeitragVerfasst: Di 19.01.16 16:24 
user profile iconDeTomaso33 hat folgendes geschrieben Zum zitierten Posting springen:

Nur mit dem einlesen des Binärcodes habe ich meine Probleme (war mir mit Binärdatei erst nicht sicher, da der Text als WordText Version 2003-2007 vorliegt, aber die Fehlermeldung läßt logisch darauf schließen).
DeTomaso33


In einer .DOC-Datei sind neben dem Text auch noch eine Menge anderer Informationen enthalten, daher kann diese nicht so einfach weiterverarbeitet werden. Für deinen Zweck musst du die Datei noch einmal in Word öffnen und als reine Textdatei speichern. Dazu musst du im Speicherdialog von Word als Dateityp "Nur Text(*.txt)" auswählen. Anschließend kannst du diese .txt-Datei in der Art einlesen wie du es mit der .doc-Datei versucht hast.

Für diesen Beitrag haben gedankt: DeTomaso33
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 19.01.16 18:14 
Hallo,

genau, nur bei einer reinen Textdatei (z.B. TXT, CSV o.ä.) kann man sinnvoll mittels File.ReadAllFiles Texte einlesen, für ein Binärformat muß man den genauen Aufbau kennen (und bei DOC-Dateien ist dieser immer noch das Geheimnis von MS).

Und wegen dem Splitting meine ich folgendes:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
var texts = s.Split('$');

writer.WriteElementString("THEMA", texts[1]);
writer.WriteElementString("Modell", texts[2]);
writer.WriteElementString("Abschnitt", texts[3]);
// ...

PS: Ist es Absicht, daß du den ersten Text mit Index 0 nicht haben möchtest (denn Arrays fangen mit Index 0 an, nicht 1)?

Für diesen Beitrag haben gedankt: DeTomaso33
DeTomaso33 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52
Erhaltene Danke: 1

Windows10
C#,HTML,CSS3,Javascript
BeitragVerfasst: Mi 20.01.16 11:44 
Hallo Th69,

das ist eine elegante Lösung. :) Bin schon zwei neue Fehlermeldungen weiter. Mit .txt ist das ArgumentException-Problem gelöst. Dafür hatte ich dann kurz ein IndexOutOfRangeException Problem. Da habe ich dann gesehen, dass die Anzahl meiner Trennzeichen zu gering war im Vergleich zur Programmierung.
Zum "Arrayindex" muss ich sagen,dass ich schon das erste Element benötige, aber beim Splitting soll ja der erste Inhalt nach dem ersten Trennzeichen ('$') genommen werden. Das klappte für einen Moment,aber erst nach einer Korrektur durch eine if-Bedingung, falls nämlich der string-Inhalt !=null ist.Zudem musste noch ein Zusatz hinzugefügt werden, damit meine Listenlinien auch als solche gelesen werden.
Dafür habe ich vor meinem using (ca.Zeile 30) noch folgende Zeile ergänzt:
ausblenden C#-Quelltext
1:
string inhalt = string.Join(null, liLines.ToArray());					

Meine erneute 2.Fehlermeldung stellt mich wieder vor ein Rätsel. :roll: Eine InvalidOperationException mit einem Hinweis zu einer Conformance-Level Einstellung. Dafür mache ich ein neues Thema auf!

mfg
DeTomaso33

Moderiert von user profile iconTh69: C#-Tags hinzugefügt