Zeilenumbruch aus TXT-File übernehmen in eingefügten Bereich
Aus einer TXT-Datei (*.ini) soll ein Vorlagen-Text einschließlich Zeilenumbrüche usw entnommen und in eine neue E-Mail eingefügt werden.
Hallo miteinander,
wie das Vorwort schon vermuten lässt, möchte ich gerne aus einer TXT-Datei, die als ini-Datei vorliegt, einen Text entnehmen. Der Text soll als Vorlage dienen und formatiert sein. Die Formatierung soll zumindest Zeilenumbrüche umfassen.
Mit meinem Code kann ich bis jetzt zeilenweise dem TXT-File entnehmen. Der Code sieht folgendermaßen aus:
NachrichtenTextErstellen
Funktion fktGetIni
Inhalt LB_MailText.ini
Ob da vielleicht jemand einen Lösungsansatz weiß...?
Danke schon jetzt für Antworten und Hinweise.
Grüße,
Andreas
Hallo miteinander,
wie das Vorwort schon vermuten lässt, möchte ich gerne aus einer TXT-Datei, die als ini-Datei vorliegt, einen Text entnehmen. Der Text soll als Vorlage dienen und formatiert sein. Die Formatierung soll zumindest Zeilenumbrüche umfassen.
Mit meinem Code kann ich bis jetzt zeilenweise dem TXT-File entnehmen. Der Code sieht folgendermaßen aus:
NachrichtenTextErstellen
Sub NachrichtenTextErstellen()
BestMailTextDATEI = "\\SERVER\....\LB_MailText.ini"
Set objMailNeu = objOlApp.CreateItem(olMailItem)
myMsgtext = _
fktGetINI(BestMailTextDATEI, "MAIL_DE", "Text01")
myMsgtext = myMsgtext & fktGetINI(BestMailTextDATEI, "MAIL_DE", "Text02")
With objMailNeu
.BodyFormat = olFormatPlain
.To = "Empf@enger.de"
.Subject = "Betreff"
.Body = myMsgtext
.Display
End With
End Sub
Funktion fktGetIni
Function fktGetINI(Dateiname As String, DieSektion _
As String, DerEintrag As String) As Variant
Temp$ = String(ZeichenZahl, 0)
X = GetPrivateProfileString(DieSektion, _
DerEintrag, "", Temp$, 255, Dateiname)
Temp$ = Left$(Temp$, X)
fktGetINI = Temp$
End Function
Inhalt LB_MailText.ini
[MAIL_DE]
Text01= Text1Zeile1 **HIER ZEILENUMBRUCH**
text1Zeile2
Text02= Text2
Ob da vielleicht jemand einen Lösungsansatz weiß...?
Danke schon jetzt für Antworten und Hinweise.
Grüße,
Andreas
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 173842
Url: https://administrator.de/forum/zeilenumbruch-aus-txt-file-uebernehmen-in-eingefuegten-bereich-173842.html
Ausgedruckt am: 08.04.2025 um 13:04 Uhr
7 Kommentare
Neuester Kommentar
Hallo ahstax.
Du hast eigentlich schon Glück, dass GetPrivateProfileString deine INI nicht als malformed zurückweist. Diese API parst natürlich zeilenweise, sodass
Entweder du bastelst dir deine eigene Funktion um solche nicht standardgerechte INI Dateien zu verarbeiten, oder du nutzt Zeichen/Zeichenkombinationen (zB.
Grüße
rubberman
Du hast eigentlich schon Glück, dass GetPrivateProfileString deine INI nicht als malformed zurückweist. Diese API parst natürlich zeilenweise, sodass
text1Zeile2
eher als neuer Eintrag interpretiert wird (wenn nicht sogar gänzlich verworfen).Entweder du bastelst dir deine eigene Funktion um solche nicht standardgerechte INI Dateien zu verarbeiten, oder du nutzt Zeichen/Zeichenkombinationen (zB.
\n
), die du nach dem Auslesen durch einen Zeilenumbruch ersetzt.Grüße
rubberman
Hallo ahstax.
Ich weiß ehrlich gesagt nicht, ob es eine Maximallänge für einen Wert in einer INI gibt, bis zu der GetPrivateProfileString in der Lage ist das Ganze noch zu verarbeiten.
Zum Einen wird es aber auf die Buffergröße ankommen, die du der Funktion übergibst (Temp$), dann hast du bereits durch die Bufferlänge 255 eine Grenze gesetzt und zuletzt wird dich der Variablentyp begrenzen, in den du einliest. Dieser dürfte (falls nicht explicit deklariert) on the fly zum String gecastet werden, von dem das MSDN sagt, dass er ca. 2 Mrd. Zeichen aufnehmen kann.
Eine Zeile ist übrigens eine Zeile. Dass der eine oder andere Texteditor die Zeilen für die Ansicht umbricht, um das Ganze lesbar zu halten, hat damit nichts zu tun. In einem HEX Editor wirst du einen Zeilenumbruch unter Windows an der Zeichenfolge 0D (Wagenrücklauf) und 0A (Zeilenvorschub) erkennen.
Nein, die gibt es für diese Art von nichtstandardgerechten Zeilen einer INI Datei nicht. Es gibt verschiedene Workarounds für VBScript, aber auch nur deshalb weil API Aufrufe für VBS nicht zur Verfügung stehen.
Um auf die Verwendung einer Zeichenfolge, wie \n zurückzukommen:
Teste mal mit
in der Funktion fktGetINI, sowie entsprechend
in der INI.
Grüße
rubberman
Zitat von @ahstax:
Der Ansatz mit "\n" könnte tatsächlich eine gangbare Lösung sein. Wie verhält sich denn die GetPrivateProfileString, wenn in der ini-Datei Text durch fortlaufende Eingabe länger als eine Zeile wird? Interessiert die dann auch nur eine Zeile?
Der Ansatz mit "\n" könnte tatsächlich eine gangbare Lösung sein. Wie verhält sich denn die GetPrivateProfileString, wenn in der ini-Datei Text durch fortlaufende Eingabe länger als eine Zeile wird? Interessiert die dann auch nur eine Zeile?
Ich weiß ehrlich gesagt nicht, ob es eine Maximallänge für einen Wert in einer INI gibt, bis zu der GetPrivateProfileString in der Lage ist das Ganze noch zu verarbeiten.
Zum Einen wird es aber auf die Buffergröße ankommen, die du der Funktion übergibst (Temp$), dann hast du bereits durch die Bufferlänge 255 eine Grenze gesetzt und zuletzt wird dich der Variablentyp begrenzen, in den du einliest. Dieser dürfte (falls nicht explicit deklariert) on the fly zum String gecastet werden, von dem das MSDN sagt, dass er ca. 2 Mrd. Zeichen aufnehmen kann.
Eine Zeile ist übrigens eine Zeile. Dass der eine oder andere Texteditor die Zeilen für die Ansicht umbricht, um das Ganze lesbar zu halten, hat damit nichts zu tun. In einem HEX Editor wirst du einen Zeilenumbruch unter Windows an der Zeichenfolge 0D (Wagenrücklauf) und 0A (Zeilenvorschub) erkennen.
Nein, die gibt es für diese Art von nichtstandardgerechten Zeilen einer INI Datei nicht. Es gibt verschiedene Workarounds für VBScript, aber auch nur deshalb weil API Aufrufe für VBS nicht zur Verfügung stehen.
Um auf die Verwendung einer Zeichenfolge, wie \n zurückzukommen:
Teste mal mit
' ...
X = GetPrivateProfileString(DieSektion, DerEintrag, "", Temp$, 255, Dateiname)
Temp$ = Replace(Temp$, "\n", vbCrLf)
' ...
Text01=Text1Zeile1\ntext1Zeile2
Grüße
rubberman
Hallo ahstax.
Danke für den "angenehmen Tag", leider war er alles Andere als angenehm ... egal.
Natürlich lassen sich Textfiles öffnen und auslesen. INI Dateien auf diese Art auszulesen und eine eindeutige Zuordnung zu bekommen, ist dann aber doch eine kleine Herausforderung. GetPrivateProfileString ist da mit einigem Abstand die beste und sicherste Methode.
Teste erst mal meinen Vorschlag. Falls das nicht den gewünschten Erfolg bringt, solltest du im nächsten Post unbedingt erwähnen in welcher Sprache du eigentlich programmierst. Im Moment sieht das für mich ein wenig nach VBA aus, kann mich aber auch irren.
Grüße
rubberman
Danke für den "angenehmen Tag", leider war er alles Andere als angenehm ... egal.
Natürlich lassen sich Textfiles öffnen und auslesen. INI Dateien auf diese Art auszulesen und eine eindeutige Zuordnung zu bekommen, ist dann aber doch eine kleine Herausforderung. GetPrivateProfileString ist da mit einigem Abstand die beste und sicherste Methode.
Teste erst mal meinen Vorschlag. Falls das nicht den gewünschten Erfolg bringt, solltest du im nächsten Post unbedingt erwähnen in welcher Sprache du eigentlich programmierst. Im Moment sieht das für mich ein wenig nach VBA aus, kann mich aber auch irren.
Grüße
rubberman
Hallo ahstax.
Kein Problem.
Trotzdem solltest du erst testen, ob du mit dem Replace weiter kommst. Alles andere wird nicht sonderlich schön, zumal du sonst, wie schon mehrfach erwähnt, keine standardkonforme INI Datei zugrunde legst. Ich habe keine Ahnung auf welche Art diese Datei erzeugt wird, aber vielleicht kann man da auch noch automatisieren oder die Anzahl der Zeilen variabel gestalten (schließlich gibt es ja auch ein Text02, warum nicht noch mehr?).
Eventuell könntest du auch statt einer INI eine XML Datei erzeugen, dann könnte man auf eine Array von Objekten zurückgreifen.
Es gibt also andere Alternativen, als Multiline-Einträge in einer INI Datei.
Grüße
rubberman
Kein Problem.
Trotzdem solltest du erst testen, ob du mit dem Replace weiter kommst. Alles andere wird nicht sonderlich schön, zumal du sonst, wie schon mehrfach erwähnt, keine standardkonforme INI Datei zugrunde legst. Ich habe keine Ahnung auf welche Art diese Datei erzeugt wird, aber vielleicht kann man da auch noch automatisieren oder die Anzahl der Zeilen variabel gestalten (schließlich gibt es ja auch ein Text02, warum nicht noch mehr?).
Eventuell könntest du auch statt einer INI eine XML Datei erzeugen, dann könnte man auf eine Array von Objekten zurückgreifen.
Es gibt also andere Alternativen, als Multiline-Einträge in einer INI Datei.
Grüße
rubberman