BASE: In Datei schreiben, ohne Anführungszeichen

Hallo,
um in eine Datei zu schreiben nutze ich folgenden Code:

    intFileNum = FreeFile
    OPEN "/Verzeichnis" & "/" & "Test.txt" FOR OUTPUT AS intFileNum
    Write #intFileNum, "TestText"
    Write #intFileNum, "Anzahl" & .RowCount

Das klappt prinzpiell, aber leider werden die Zeilen mit umschließenden "Anführungszeichen" eingetragen; wie funktioniert es ohne?
Für die Ausgabe von String-Werten aus dem RowSet funktioniert es durch

    .Columns(1).Value

statt

    .Columns(1).String

Danke, Michael

Hey Michael,

nimm einfach mal statt der Write - Anweisung die Print-Anweisung. Die schreibt ohne Hochzeichen.

Wichtig: Der Unterschied zwischen "Write" und "Print" liegt bei dem Separator!

mit Write #xxx "1","2", "ab"   wird der Separator "," übernommen und Texte in Hochzeichen gesetzt

Ergebnis:  "1","2", "ab"

mit Print #xxx "1","2", "ab"  wird als Separator eine Anzahl Leerzeichen verwendet (Blockweises Schreiben), die Textmarker ("") werden nicht eingefügt.

Ergebnis:  1    2    ab

Viele Grüße

Thomas

Nachtrag:

Statt der Basic-Variante zum Schreiben eines Textfiles empfehle ich im Übrigen die UNO-Variante. Der Code wird dann zwar etwas länger, wäre aber auch flexibler, insbesondere kannst Du dort das Encoding - also den Zeichensatz - festlegen:)

Der Codeteil würde dann lauten:

oSFA = createUnoService("com.sun.star.ucb.SimpleFileAccess")
 oOutputStream = createUnoService("com.sun.star.io.TextOutputStream")
 sUrl = convertToURL("/Verzeichnis" & "/" & "Test.txt")
 oDatei = oSFA.OpenFileWrite(sURL)
 With oOutputStream
    .setOutPutStream(oDatei.getOutPutStream)
    .writeString("TestText" & chr(13) & chr(10))
    .writeString("Anzahl " & .RowCount   & chr(13) & chr(10))
    .closeOutput()
 end with

Du musst allerdings jede Textzeile selbst mit dem passenden Zeile-Ende Zeichen versehen - für Windows z.B. chr(13) & chr(10) - WriteString schreibt in einem fort:) Auch sollte eine schon bestehende Datei vorher gelöscht werden - und dann neu erzeugt werden - sonst kann es Überraschungen geben.  Die Methode beschreibt nämlich an Anfang so viel, wie übergeben wird. Hatte die alte Datei mehr Text, so verbleibt der in der Datei!  Na ja, aber das ist ja alles dokumentiert;)

Noch etwas:

Für die Ausgabe von String-Werten aus dem RowSet funktioniert es durch
   .Columns(1).Value
statt
   .Columns(1).String

Das ist nicht ganz korrekt;) Ein Rowset-Wert hat zwar immer einen Stringwert (die Repräsentation des Inhalts als String) , nicht aber einen Value-Wert. Den gibt es tatsächlich nur bei Zahlen und bei entsprechender Spezifikation der Spalte als "Wert"!

Viele Grüße

Thomas

Danke Thomas,

nimm einfach mal statt der Write - Anweisung die Print-Anweisung. Die schreibt ohne Hochzeichen.

Perfekt! Danke auch für den Hinweis zum

Unterschied zwischen "Write" und "Print" liegt bei dem Separator!

Da muss ich noch viel lernen ...

Viele Grüße, Michael

Hallo Thomas,

Danke für den Nachtrag, leider hatte ich ihn gestern noch gar nicht gesehen. Die UNO-Variante ist für mich wegen des Encodings interessant!

Nachtrag:
Statt der Basic-Variante zum Schreiben eines Textfiles empfehle ich im Übrigen die UNO-Variante. Der Code wird dann zwar etwas länger, wäre aber auch flexibler, insbesondere kannst Du dort das Encoding - also den Zeichensatz - festlegen:)
Der Codeteil würde dann lauten:

oSFA = createUnoService("com.sun.star.ucb.SimpleFileAccess")
 oOutputStream = createUnoService("com.sun.star.io.TextOutputStream")
 sUrl = convertToURL("/Verzeichnis" & "/" & "Test.txt")

Ergänzung "Datei löschen":
  If oSFA.exists(sURL) Then
     oSFA.kill(sURL)
  End If

oDatei = oSFA.OpenFileWrite(sURL)
 With oOutputStream
    .setOutPutStream(oDatei.getOutPutStream)
    .writeString("TestText" & chr(13) & chr(10))     ' Für LINUX nur chr(10)
    .writeString("Anzahl " & .RowCount   & chr(13) & chr(10))
    .closeOutput()
 end with

...Die Methode beschreibt nämlich an Anfang so viel, wie übergeben wird. Hatte die alte Datei mehr Text, so verbleibt der in der Datei!  Na ja, aber das ist ja alles dokumentiert;)

Zur Dokumentation suche ich noch eine gute Quelle: In Deinem Buch? Auch Andrew Pitonyak (EN <https://pitonyak.org/book/> / DE <https://www.uni-due.de/~abi070/ooo.html>) verrät mir nicht, welche Optionen außer
  .setEncoding("UTF-8")
zulässig sind. Was ist mit ANSI oder UTF-8 mit und ohne BOM?

Vielen Dank, Michael

Hi Michael,

zur Frage .setEncoding():

Die LO API Reference zum Interface XTextOutputStream (https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1io_1_1XTextOutputStream.html)
weist auf das Dokument "http://www.iana.org/assignments/character-sets" hin. Was davon möglich ist, hängt von der Implementierung ab.

Viel Erfolg,
Volker