Entwickler-Ecke

IO, XML und Registry - Textdatei auslesen, teilen und als Xml-Datei speichern


ElGadaa - Di 18.07.17 09:16
Titel: Textdatei auslesen, teilen und als Xml-Datei speichern
Hallo zusammen,

ich bin keinen Programmier, aber versuche gern kleinere Programme zu basteln.
ich habe eine Textdatei, die aus mehrere Hundert Zeilen besteht und so aussieht.

011001;Artikel x;20$
011002;Artikel y;10$
usw...

ich lese die Datei zeilenweise und teile die zeilen nach erhaltene ";" zeichen
danach will ich mit dieser Informationen eine Xml-Datei erstellen, die so aussehen soll.


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
<Artikels>
  <Artikel>
       <artNr>011001</artNr>
        <artName>Artikel x</artName>
        <artPreis>20$</artPreis>
    </Artikel>
  <Artikel>
       <artNr>011002</artNr>
        <artName>Artikel y</artName>
        <artPreis>10$</artPreis>
    </Artikel>
  ....
</Artikels>


leider bekomme ich nur die ersten 130 Artikels , danach es gibt IndexOutOfRangeException Fehler...

meine Code sieht so aus....



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:
private void FileToXml()
    {
     string artNr;
     string artName;
     string artPreis;


     string line = "";
     string fileNameAndPath = @"C:/Daten/Artikels.txt";
            
     System.IO.StreamReader file = new System.IO.StreamReader(fileNameAndPath);
            
     XmlWriterSettings settings = new XmlWriterSettings();
     settings.Indent = true;

     XmlWriter writer = XmlWriter.Create(@"C:/Daten/Artikels.xml", settings);
        
        writer.WriteStartDocument();
        writer.WriteStartElement("Artikels");
               
            while ((line = file.ReadLine()) != null)
            {
               string[] sp = line.Split(';');

                    artNr = sp[0];
                    artName = sp[1];
                    artPreis = sp[2];

                    writer.WriteStartElement("Artikel");
                       writer.WriteElementString("artNr", artNr);
                       writer.WriteElementString("artName", artName);
                       writer.WriteElementString("artPreis", artPreis);
                    writer.WriteEndElement();
                
             }
              
          writer.WriteEndElement();
          writer.WriteEndDocument();
          writer.Close();
               
      file.Close();

   }


so für hinweise wäre ich wirklich dankbar :))

vielen Dank
El


hydemarie - Di 18.07.17 09:28

Wie sieht denn die Zeile aus, in der das Programm abbricht?


Th69 - Di 18.07.17 09:43

Hallo und :welcome:

wahrscheinlich gibt es in der CSV-Datei eine Zeile mit weniger als 2 Trennzeichen (oder sogar eine Leerzeile).
Dann fange dies z.B. mit

C++-Quelltext
1:
2:
3:
4:
5:
string[] sp = line.Split(';');
if (sp.Length > 2)
{
  // ...
}

ab.


ElGadaa - Di 18.07.17 10:44

user profile iconhydemarie hat folgendes geschrieben Zum zitierten Posting springen:
Wie sieht denn die Zeile aus, in der das Programm abbricht?


Das Programm bricht in zeile 26 mit folgende Fehlermeldung ab.
"IndexOutOfRangeException wurde nicht behnadelt. Der Index war außerhalb des Arraybereichs."


hydemarie - Di 18.07.17 10:45

Ich meinte deine mehrhundertzeilige Textdatei. Wenn da plötzlich sp[1] nicht mehr existiert, dann hat die Zeile wohl kein Semikolon.


ElGadaa - Di 18.07.17 10:51

Hallo Th69,

hab nochmal kontrolliert, die Textdatei ist in Ordnung.
was ich jetzt bemerk habe, dass das Programm manchmal in der zeile 130, 131 oder in der Zeile 133 abbricht...


hydemarie - Di 18.07.17 10:56

user profile iconElGadaa hat folgendes geschrieben Zum zitierten Posting springen:
die Textdatei ist in Ordnung.


Wetten, dass nicht?


ElGadaa - Di 18.07.17 10:56

user profile iconhydemarie hat folgendes geschrieben Zum zitierten Posting springen:
Ich meinte deine mehrhundertzeilige Textdatei. Wenn da plötzlich sp[1] nicht mehr existiert, dann hat die Zeile wohl kein Semikolon.


Die Zeilen sehen alle gleich, drei Spalten, die von einander mit einem Semikolon getrennt sind.

Aber ich werde sie nochmal ordentlich kontrollierren...


doublecross - Mi 19.07.17 13:18

Klicke am besten einmal das kleine Fenster mit der Fehlermeldung weg und Fahre mit der Maus im Studio über das Wort "line", dann sollte dir angezeigt werden, welcher Wert gerade in dieser Variable steht. Ich schließe mich den Kollegen an, dass dieser Wahrscheinlich nicht in dein Schema passt.

Generell sollte ein Programm auch nie davon ausgehen, dass die Datei intakt ist und sollte dies ständig überprüfen, mindestens so wie von user profile iconTh69 vorgeschlagen, indem fehlerhafte Datensätze ignoriert werden.