Skript für Template-Filegenerierung
Suche Programm, dass aus einem Template und einer .csv für jede Zeile ein ausgefülltes Template erzeugt
Hallo,
ich suche etwas, das bestimmt irgendwer schon irgendwo im Internet gepostet hat, aber ich finde es nicht:
Ich habe ein Programm, das z.B. Nutzeranlagen als einzelne XML-Files entgegennimmt. Wenn ich nun eine Liste mit 20 Nutzeranlagen habe, muss ich 20 XML-Files erstellen, in denen ich jeweils nur den Name veränder. Das ist irgendwie umständlich, und muss doch auch einfacher gehen.
Ich suche also ein Skript mit folgender Funktionalität:
Übergeben werden zwei Dateien: Eine .csv mit beliebiger Spalten- und Zeilenzahl und ein Template. In dem Template sind Platzhalter entsprechend den Spaltennamen enthalten. Für jede Zeile erzeugt das Skript nun eine neue Datei, in der die Platzhalter mit den entsprechenden Spaltenwerten ersetzt werden.
Kann mir jemand bei der Suche weiterhelfen?
Danke
Filipp
Hallo,
ich suche etwas, das bestimmt irgendwer schon irgendwo im Internet gepostet hat, aber ich finde es nicht:
Ich habe ein Programm, das z.B. Nutzeranlagen als einzelne XML-Files entgegennimmt. Wenn ich nun eine Liste mit 20 Nutzeranlagen habe, muss ich 20 XML-Files erstellen, in denen ich jeweils nur den Name veränder. Das ist irgendwie umständlich, und muss doch auch einfacher gehen.
Ich suche also ein Skript mit folgender Funktionalität:
Übergeben werden zwei Dateien: Eine .csv mit beliebiger Spalten- und Zeilenzahl und ein Template. In dem Template sind Platzhalter entsprechend den Spaltennamen enthalten. Für jede Zeile erzeugt das Skript nun eine neue Datei, in der die Platzhalter mit den entsprechenden Spaltenwerten ersetzt werden.
Kann mir jemand bei der Suche weiterhelfen?
Danke
Filipp
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 150165
Url: https://administrator.de/contentid/150165
Ausgedruckt am: 21.11.2024 um 22:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo filippg!
Wozu suchen - selber schreiben ...
... als VBS schematisch (und ungetestet) etwa so:
Vorausgesetzt wird, dass die Platzhalter als Feldnamen in der der ersten Zeile der CSV-Datei in der exakt gleichen Schreibweise stehen und es keine Fehler in der Struktur der Daten gibt.
Da ich keine Informationen über die Namen der Zieldateien hatte, wird einfach der Inhalt des jeweils ersten Feldes als Name verwendet ...
[Edit] Inzwischen oberflächlich getestet und einige Fehler korrigiert. [/Edit]
Grüße
bastla
Wozu suchen - selber schreiben ...
... als VBS schematisch (und ungetestet) etwa so:
CSV = "D:\Die.csv"
Delim = ";"
Template = "D:\Template.xml"
Pfad = "D:\Ausgabepfad XML-Dateien"
Set fso = CreateObject("Scripting.FileSystemObject")
TemplateText = fso.OpenTextFile(Template).ReadAll 'Templateinhalt einlesen
Daten = Split(fso.OpenTextFile(CSV).ReadAll, vbCrLf) 'Daten aus CSV in Array einlesen
Felder = Split(Daten(0), Delim) 'Feldnamen = Platzhalter aus erster Zeile der CSV in Array einlesen
For i = 1 To UBound(Daten) 'alle Datensätze durchgehen
Info = Split(Daten(i), Delim) 'Informationen aus den einzelnen Feldern des Datensatzes in Array einlesen
XML = Pfad & "\" & Info(0) & ".xml" 'Dateiname aus erstem Feld übernehmen
XMLText = TemplateText 'Originaltemplate als Ausgangspunkt
For j = 0 To UBound(Info) 'alle Felder durchgehen
XMLText = Replace(XMLText, Felder(j), Info(j)) 'anhand der Feldnamen die Platzhalter durch die eingelesenen Informationen erstezen
Next
fso.CreateTextFile(XML).Write XMLText 'Datei schreiben
Next
Da ich keine Informationen über die Namen der Zieldateien hatte, wird einfach der Inhalt des jeweils ersten Feldes als Name verwendet ...
[Edit] Inzwischen oberflächlich getestet und einige Fehler korrigiert. [/Edit]
Grüße
bastla
Hallo Filipp!
Mein Ansatz war ja nur als Grundgerüst gedacht - eine "vernünftige" Reaktion auf bereits vorhandene Ausgabedateien kann ja, wenn sie einmal definiert ist , nicht so schwer zu realisieren sein ...
Etwas kniffliger:
Vorausgesetzt habe ich, dass Felder, welche das Trennzeichen enthalten, auf jeden Fall unter Anführungszeichen stehen (ansonsten wäre ja eine Unterscheidung, noch dazu bei der gewünschten variablen Feldanzahl, gar nicht möglich). Zerlegt wird in dieser Demo die (mit ein paar "Spezialfällen" angereicherte) Zeile
Grüße
bastla
Mein Ansatz war ja nur als Grundgerüst gedacht - eine "vernünftige" Reaktion auf bereits vorhandene Ausgabedateien kann ja, wenn sie einmal definiert ist , nicht so schwer zu realisieren sein ...
Etwas kniffliger:
Z.B. wird das Skript nicht damit klarkommen, wenn das Delimiterzeichen in einem Feld enthalten ist.
Abgesehen davon, dass ja Du die CSV erstellst oder zumindest Einfluss darauf haben solltest und Dir wohl nicht selbst Knüppel zwischen die Beine werfen wirst, ließe sich auch das (vermutlich noch eleganter) lösen - zB als mit "cscript
" zu startende Demo für eine Zeile:Zeile = """;Feld1"";Feld2;""Feld3;"";"""";""Feld 5"";""Feld 6 mit ; im Wert"";;;Feld 9"
Delim = ";"
Auf = "{" 'beliebiges nicht in den Daten enthaltenes Zeichen
Zu = "}" 'anderes nicht in den Daten enthaltenes Zeichen
Dummy = "@" 'noch ein nicht in den Daten enthaltenes Zeichen
WScript.Echo "Original :" & Zeile
'Unmittelbar aufeinander folgende Anführungszeichen kennzeichnen ein leeres Feld und ...
'... können daher vorweg durch "Nichts" ersetzt werden
Z = Replace(Zeile, """""", "")
WScript.Echo "Leer ohne "":" & Z
Set rE = New RegExp
rE.Global = True
'Suche nach paarweisen Anführungszeichen ...
rE.Pattern = "("")([^""]*)("")"
'... und Ersetzen durch öffnende und schließende Klammern
Z = rE.Replace(Z, Auf & "$2" & Zu)
WScript.Echo "Geklammert :" & Z
'Suche nach Vorkommen von Trennzeichen innerhalb der Klammern, zB {abc;xyz} und ...
'Aufteilung: ( $1 ) ( $2 ) ( $3 )
rE.Pattern = "(" &Auf&"[^"&Delim&"]*)" & "("&Delim&")" & "([^"&Delim&"]*"&Zu&")"
'Ergebnis: $1={abc $2=; $3=xyz}
'... Ersetzen des im Feld enthaltenen Trennzeichens = $2 durch einen "Dummy"-Wert ...
Z = rE.Replace(Z, "$1" & Dummy & "$3")
'... sowie Entfernung der umschließenden Klammern "{" und "}"
Z = Replace(Replace(Z, Auf, ""), Zu, "")
WScript.Echo "mit Dummy :" & Z & vbCrLf
'Zerlegung anhand des Trennzeichens in Felder
Felder = Split(Z, Delim)
For i = 0 To UBound(Felder) 'Durchlaufen der einzelnen Felder
'Demo-Ausgabe mit Rückwandlung des "Dummy"-Wertes in das Trennzeichen
WScript.Echo "Feld " & i + 1 & ": |" & Replace(Felder(i), Dummy, Delim) & "|"
Next
";Feld1";Feld2;"Feld3;";"";"Feld 5";"Feld 6 mit ; im Wert";;;Feld 9
bastla