FileSystemObject mit UTF-8 Charset

Chris B

Mitglied
Hallo. Ich will Tabellen aus Access mit VBA herausschreiben und als XML-Dokument speichern. ( Ich hoffe, ich hab das richtige Forum getroffen)

Code:
  Dim inhalt As FileSystemObject
  Dim liste As TextStream

  Set inhalt = CreateObject("Scripting.FileSystemObject")
  Set liste = inhalt.CreateTextFile(filelist, True, True)

Das sind die Hauptvariablen, die dafür verwendet werden - filelist ist der Speicherpfad sammt Dateinname.

Code:
  liste.writeline (TmpString)

Hiermit füge ich die einzelnen Elemente in das FileSystemObject ein.

Der erste Teil von der Datei (Per TempString) eingelesen trägt zwar als Information
Code:
TmpString = "<?xml version=""1.0"" encoding=""UTF-8""?>"
, wird aber (logischerweise) dadurch nicht gleich als UTF-8 behandelt(weil das ja eine Info für den Browser ist).

Am Schluss steht dann ein
Code:
liste.Close
zum Schließen des Objects.

Die Datei ist jetzt als ANSII gespeichert. Das Problem ist, dass ANSII Zeichen wie í nicht interpretieren kann.

Ein String kann zwar die speziellen Zeichen interpretieren und ich könnte ihn dann als ADODB Stream speichern
liste = liste & vbCrLf & xmlString
Code:
Private Sub SaveXMLFile(XMLPath As String, XMLContent As String)
    Dim ADODBStream As ADODB.Stream
    Set ADODBStream = CreateObject("ADODB.Stream")
        ADODBStream.Charset = "UTF-8"
        ADODBStream.Open
        ADODBStream.WriteText XMLContent
        ADODBStream.SaveToFile XMLPath, adSaveCreateOverWrite
        ADODBStream.Close
    Set ADODBStream = Nothing
End Sub
, der Nachteil ist aber eine hohe Speicherauslastung(durch den String), was die Verarbeitungszeit exponential steigert und auch zum Programmabsturz führen kann.

Zu meiner Frage
Ist es möglich, eine UTF-8 formatierte Datei zu erzeugen mit der gleichen Verarbeitungsgeschwindigkeit wie das FileSystemObject, oder kann ich das FileSystemObject als UTF-8 formatieren?
 
Selbst ist der Mann...

Anstatt die Strings in ein FSO zu schreiben, habe ich Den String gleich in einen ADODB.Stream Objekt eingefügt.

Dim AdoList As ADODB.Stream
Set AdoList = CreateObject("ADODB.Stream")

AdoList.Charset = "UTF-8"
AdoList.Mode = adModeReadWrite
AdoList.Type = adTypeText
AdoList.Open

Stream wird als UTF-8-formatiertem Stream geöffnet. Er kann gelesen und beschrieben werden und enthält Text.

So wird Text in das Stream-Objekt eingeschrieben
headerString ="TEST"
Call AddAdoList(AdoList, headerString & vbCrLf)

Zur Funktion komme ich gleich; Die String-Variable muss natürlich vorher deklariert werden

Die Funktion übergibt den Stream, den Inhalt und einen "Zeilenumbruch"

Private Sub AddAdoList(ByVal AdoList As ADODB.Stream, DataString As String)
'AdoList.SetEOS
AdoList.WriteText (DataString)
End Sub

AdoList ein Pointer auf den Stream.
Mit
SetEOS könnte man ans Ende des Streams springen, aber in meinem Fall nicht erforderlich. Falls er nicht am Ende ist, würde der Inhalt überschrieben ab der Position, an der, der Stream gerade steht. WriteText fügt Text ab der aktuellen Position ein.

AdoList.SaveToFile filelist, adSaveCreateOverWrite
AdoList.Close
Set AdoList = Nothing

SaveToFile speichert den Steam.
filelist enthält den Dateipfad sammt Namen (Bsp: C:\Datei.xml)
adSaveCreateOverWrite gibt an, dass die Datei, falls Sie schon existiert überschrieben wird
Close schließt den Stream
 

Neue Beiträge

Zurück