Hallo,
nach seeeeehr langer Zwangsprogrammierpause, hab ich wieder was programmiert, aber leider ist das Ergebnis nicht ganz wie gewünscht.
Ich lese eine 1,4 GB (tendenz steigend) große XML-Datei aus und schreibe gewissen Elemente und Attribute in eine CSV-Datei. Das klappt an sich schon ganz gut, aber leider werden die letzten Zeilen nicht mehr vollständig ausgelesen bzw. in CSV gespeichert. Meist ist eine Zeile irgendwo mittendrin abgeschnitten und die Datei hört dort auf. Das ist das erste Mal, dass ich mit XML und CSV arbeite.
Nur zur Info: Ich weiß, dass XML auch von Excel und Co. recht gut ausgelesen werden kann, aber hier ist CSV zwingend erforderlich, da nicht nur in diesen Programmen damit gearbeitet wird und auch Laien recht schnell zu einer Tabelle kommen sollen, ohne allzuviel rumfrickeln zu müssen, also bitte keine Antworten à la "lass doch einfach alles in XML".
Ich gehe mal davon aus, dass der Speicher überlastet wird, und daher die Daten abgeschnitten werden. Ich habe schon versucht mit "Using" zu arbeiten, hat auch nicht viel gebracht. Die CSV-Befehle benötigen keine extra Flush-Zeile, da der letzte Befehl im Loop diesen automatisch ausführt.
Es dürfte also am Stream der XML-Datei liegen, den zu flushen, habe ich auch schon mal versucht. Hat auch nichts gebracht, da war die Datei dann auf einmal viel kleiner als sie sein sollte, oder hab ich da was falsch gemacht. Was habe ich da übersehen? Ich suche schon seit einer Woche im Netz.
Anbei den Code:
LG,
Pascal
*Topic verschoben*
nach seeeeehr langer Zwangsprogrammierpause, hab ich wieder was programmiert, aber leider ist das Ergebnis nicht ganz wie gewünscht.
Ich lese eine 1,4 GB (tendenz steigend) große XML-Datei aus und schreibe gewissen Elemente und Attribute in eine CSV-Datei. Das klappt an sich schon ganz gut, aber leider werden die letzten Zeilen nicht mehr vollständig ausgelesen bzw. in CSV gespeichert. Meist ist eine Zeile irgendwo mittendrin abgeschnitten und die Datei hört dort auf. Das ist das erste Mal, dass ich mit XML und CSV arbeite.
Nur zur Info: Ich weiß, dass XML auch von Excel und Co. recht gut ausgelesen werden kann, aber hier ist CSV zwingend erforderlich, da nicht nur in diesen Programmen damit gearbeitet wird und auch Laien recht schnell zu einer Tabelle kommen sollen, ohne allzuviel rumfrickeln zu müssen, also bitte keine Antworten à la "lass doch einfach alles in XML".
Ich gehe mal davon aus, dass der Speicher überlastet wird, und daher die Daten abgeschnitten werden. Ich habe schon versucht mit "Using" zu arbeiten, hat auch nicht viel gebracht. Die CSV-Befehle benötigen keine extra Flush-Zeile, da der letzte Befehl im Loop diesen automatisch ausführt.
Es dürfte also am Stream der XML-Datei liegen, den zu flushen, habe ich auch schon mal versucht. Hat auch nichts gebracht, da war die Datei dann auf einmal viel kleiner als sie sein sollte, oder hab ich da was falsch gemacht. Was habe ich da übersehen? Ich suche schon seit einer Woche im Netz.
Anbei den Code:
VB.NET-Quellcode
- Imports System.Xml
- Imports CsvHelper
- Imports System.IO
- Partial Class lu_lod
- Inherits subs
- Function xmltocsv()
- Dim WorkingFolder = Server.MapPath("")
- Dim TextWriter = File.CreateText("\translating-it.eu\wwwroot\Admin\lod.csv")
- Dim xmlfile = Path.Combine(WorkingFolder, "lod-opendata.xml")
- Dim csvwriter As New CsvWriter(TextWriter, Globalization.CultureInfo.CurrentCulture)
- Dim str_item As String
- Dim str_variantcorrect As String
- Dim str_pluriel As String
- Dim str_pluriel2 As String
- Dim boo_varianteh As Boolean
- Dim boo_variantel As Boolean
- Dim boo_varianteo As Boolean
- Dim readxml As XmlReader = XmlReader.Create(xmlfile)
- While readxml.Read
- If readxml.IsStartElement Then
- If readxml.Name = "lod:ITEM-ADRESSE" Then
- If readxml.Read() Then
- str_item = readxml.Value
- End If
- End If
- If readxml.Name = "lod:FORME-PLURIEL" Then
- If readxml.Read() Then
- str_pluriel = readxml.Value
- End If
- End If
- If readxml.Name = "lod:FORME-PLURIEL" And str_pluriel <> "" Then
- If readxml.Read() Then
- str_pluriel2 = readxml.Value
- End If
- End If
- If readxml.Name = "lod:RENVOI-ADJ" Then
- str_variantcorrect = readxml("lod:ID-ITEM-ADRESSE")
- End If
- If readxml.Name = "lod:RENVOI-ADV" Then
- str_variantcorrect = readxml("lod:ID-ITEM-ADRESSE")
- End If
- If readxml.Name = "lod:RENVOI-ART" Then
- str_variantcorrect = readxml("lod:ID-ITEM-ADRESSE")
- End If
- If readxml.Name = "lod:RENVOI-CONJ" Then
- str_variantcorrect = readxml("lod:ID-ITEM-ADRESSE")
- End If
- If readxml.Name = "lod:RENVOI-ET-TRAIT-LING-SUPPL-SUBST" Then
- str_variantcorrect = readxml("lod:ID-ITEM-ADRESSE")
- End If
- If readxml.Name = "lod:RENVOI-INT" Then
- str_variantcorrect = readxml("lod:ID-ITEM-ADRESSE")
- End If
- If readxml.Name = "lod:RENVOI-PART" Then
- str_variantcorrect = readxml("lod:ID-ITEM-ADRESSE")
- End If
- If readxml.Name = "lod:RENVOI-PREP" Then
- str_variantcorrect = readxml("lod:ID-ITEM-ADRESSE")
- End If
- If readxml.Name = "lod:RENVOI-PRON" Then
- str_variantcorrect = readxml("lod:ID-ITEM-ADRESSE")
- End If
- If readxml.Name = "lod:RENVOI-SUBST" Then
- str_variantcorrect = readxml("lod:ID-ITEM-ADRESSE")
- End If
- If readxml.Name = "lod:RENVOI-VRB" Then
- str_variantcorrect = readxml("lod:ID-ITEM-ADRESSE")
- End If
- If readxml.Name = "lod:VARIANTE-HOMOSEME" Then
- boo_varianteh = True
- End If
- If readxml.Name = "lod:VARIANTE-LOCALE" Then
- boo_variantel = True
- End If
- If readxml.Name = "lod:VARIANTE-ORTHOGRAPHIQUE" Then
- boo_varianteo = True
- End If
- End If
- If readxml.NodeType = XmlNodeType.EndElement Then
- If readxml.Name = "lod:ITEM" Then
- csvwriter.WriteField(str_item)
- csvwriter.WriteField(str_pluriel)
- csvwriter.WriteField(str_pluriel2)
- csvwriter.WriteField(str_variantcorrect)
- csvwriter.WriteField(boo_varianteh)
- csvwriter.WriteField(boo_variantel)
- csvwriter.WriteField(boo_varianteo)
- csvwriter.NextRecord()
- boo_varianteh = False
- boo_variantel = False
- boo_varianteo = False
- str_item = ""
- str_variantcorrect = ""
- str_pluriel = ""
- str_pluriel2 = ""
- End If
- End If
- End While
- End Function
- End Class
LG,
Pascal
*Topic verschoben*
Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()