Datei als UTF-8 mit BOM wegschreiben
Moderator: Moderatoren
Datei als UTF-8 mit BOM wegschreiben
Ich möchte eine Calc Tabelle mit einem Basic Makro auslesen und in eine Textdatei schreiben. Diese muß in UTF-8 mit BOM formatiert sein.
Daswegschreiben als UTF-8 ist ja kein größeres Problem.
Die BOM überfordert mich aber etwas. Wie kriege ich die an den Anfang der Datei?
Hier mein Makro:
Sub CSV_U_save_Unicode()
GlobalScope.BasicLibraries.LoadLibrary("Tools")
' ----------------------------------------------------------------------
'define variables
dim FileName as string
dim FilePath as string
dim FileTemp as string
dim FileSave as string
dim SavePath as string
dim dummy()
' ----------------------------------------------------------------------
'Pfad auslesen und in Variablen schreiben
FileTemp = thisComponent.geturl()
'Speicherpfad in Dateinamen umwandeln
FileTemp = ConvertFromUrl(FileTemp)
FileName = FileNameoutofPath(FileTemp)
FilePath = DirectoryNameoutofPath(FileTemp,"\")
'der Sicherungspfad wird gleich dem Ursprungpfad gesetzt
FileSave = FileTemp
'Eingabemaske zum manuellen Abändern der Pfadangabe
FileSave = InputBox("Pfad und Dateiname", "ODS + CSV_U - sichern Klaes Version 7.x", FileTemp)
'wenn die vorhande Pfadangabe nicht korrekt ist erfolgt ein Abbruch
If FileSave = "" Then
End
End Sub
'Speicherpfad erzeugen und als ods speichern
SavePath = ConvertToUrl(FileSave)
thisComponent.storeAsUrl(SavePath,dummy())
'CVS_U speichern
' ----------------------------------------------------------------------
'die Letzte verwendete Zeile und Spalte ermitteln
dim LetzteSpalte as integer
dim LetzteZeile as integer
dim sTabelle as object
dim oCursor as object
sTabelle = thisComponent.sheets(0)
oCursor = sTabelle.createCursor
oCursor.GotoEndOfUsedArea(False)
LetzteSpalte = oCursor.getRangeAddress().endColumn
LetzteZeile = oCursor.getRangeAddress().endRow
'Speicherpfad erzeugen und als csv_u speichern
Dim temp as String
temp = GetFileNameWithoutExtension(FileName)
FileSave = FilePath & "\" & temp & ".csv_U"
'Zeilenweise auslesen und in eine Datei speichern
dim i as integer
dim ic as integer
dim Trennzeichen as string
dim Zeile as string
dim Zelle as string
dim oFileWrite as object
dim oOutputStream as object
dim oStream as object
oFileWrite = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
oOutputStream = createUnoService("com.sun.star.io.TextOutputStream")
oOutputStream.Encoding = "UTF-8"
If oFileWrite.exists(FileSave) Then
oFileWrite.kill(FileSave)
End If
'Datei öffnen zum schreiben des Strings
oStream = oFileWrite.openFileWrite(FileSave)
oOutputStream.setOutputStream(oStream)
'Zähler für Zeile + Spalte auf 0 setzen Trennzeichen zwischen den Zellen definieren
i=0
ic=0
Trennzeichen = ";"
Do until i - 1 = LetzteZeile
Do until ic - 1 = LetzteSpalte
Zelle = sTabelle.getCellByPosition(ic,i).string
ic = ic + 1
Zeile = Zeile & Zelle & Trennzeichen
Loop
oOutputStream.writeString(Zeile & CHR$(10))
Zeile = ""
i = i + 1
ic = 0
Loop
'Datei schließen
oOutputStream.closeOutput()
'Dokument schließen
'thisComponent.close(true)
end sub
Kann mir jemand helfen?
Daswegschreiben als UTF-8 ist ja kein größeres Problem.
Die BOM überfordert mich aber etwas. Wie kriege ich die an den Anfang der Datei?
Hier mein Makro:
Sub CSV_U_save_Unicode()
GlobalScope.BasicLibraries.LoadLibrary("Tools")
' ----------------------------------------------------------------------
'define variables
dim FileName as string
dim FilePath as string
dim FileTemp as string
dim FileSave as string
dim SavePath as string
dim dummy()
' ----------------------------------------------------------------------
'Pfad auslesen und in Variablen schreiben
FileTemp = thisComponent.geturl()
'Speicherpfad in Dateinamen umwandeln
FileTemp = ConvertFromUrl(FileTemp)
FileName = FileNameoutofPath(FileTemp)
FilePath = DirectoryNameoutofPath(FileTemp,"\")
'der Sicherungspfad wird gleich dem Ursprungpfad gesetzt
FileSave = FileTemp
'Eingabemaske zum manuellen Abändern der Pfadangabe
FileSave = InputBox("Pfad und Dateiname", "ODS + CSV_U - sichern Klaes Version 7.x", FileTemp)
'wenn die vorhande Pfadangabe nicht korrekt ist erfolgt ein Abbruch
If FileSave = "" Then
End
End Sub
'Speicherpfad erzeugen und als ods speichern
SavePath = ConvertToUrl(FileSave)
thisComponent.storeAsUrl(SavePath,dummy())
'CVS_U speichern
' ----------------------------------------------------------------------
'die Letzte verwendete Zeile und Spalte ermitteln
dim LetzteSpalte as integer
dim LetzteZeile as integer
dim sTabelle as object
dim oCursor as object
sTabelle = thisComponent.sheets(0)
oCursor = sTabelle.createCursor
oCursor.GotoEndOfUsedArea(False)
LetzteSpalte = oCursor.getRangeAddress().endColumn
LetzteZeile = oCursor.getRangeAddress().endRow
'Speicherpfad erzeugen und als csv_u speichern
Dim temp as String
temp = GetFileNameWithoutExtension(FileName)
FileSave = FilePath & "\" & temp & ".csv_U"
'Zeilenweise auslesen und in eine Datei speichern
dim i as integer
dim ic as integer
dim Trennzeichen as string
dim Zeile as string
dim Zelle as string
dim oFileWrite as object
dim oOutputStream as object
dim oStream as object
oFileWrite = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
oOutputStream = createUnoService("com.sun.star.io.TextOutputStream")
oOutputStream.Encoding = "UTF-8"
If oFileWrite.exists(FileSave) Then
oFileWrite.kill(FileSave)
End If
'Datei öffnen zum schreiben des Strings
oStream = oFileWrite.openFileWrite(FileSave)
oOutputStream.setOutputStream(oStream)
'Zähler für Zeile + Spalte auf 0 setzen Trennzeichen zwischen den Zellen definieren
i=0
ic=0
Trennzeichen = ";"
Do until i - 1 = LetzteZeile
Do until ic - 1 = LetzteSpalte
Zelle = sTabelle.getCellByPosition(ic,i).string
ic = ic + 1
Zeile = Zeile & Zelle & Trennzeichen
Loop
oOutputStream.writeString(Zeile & CHR$(10))
Zeile = ""
i = i + 1
ic = 0
Loop
'Datei schließen
oOutputStream.closeOutput()
'Dokument schließen
'thisComponent.close(true)
end sub
Kann mir jemand helfen?
Re: Datei als UTF-8 mit BOM wegschreiben
Hallo klm,
was in Henkersnamen ist denn nun schon wieder BOM!? Da kann ich mir nichts drunter vorstellen. Mach uns (mich) mal etwas schlauer, bitte schön.
Gruß
balu
was in Henkersnamen ist denn nun schon wieder BOM!? Da kann ich mir nichts drunter vorstellen. Mach uns (mich) mal etwas schlauer, bitte schön.
Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.
wehr rächtschraipfähler findet khan si behalden
wehr rächtschraipfähler findet khan si behalden

Re: Datei als UTF-8 mit BOM wegschreiben
Hallo
Utf8 benötigt doch eigentlich keine BOM oder sehe ich das falsch.
Wie dem auch sei, als Workaround:
Öffne die Datei nach dem speichern nochmal mit einem vernünftigen Editor ( für Windows z.B. Notepad++ unter Linux gehts mit Geany ) und stelle dort ein mit BOM zu speichern.
Zu deinem Code hätte ich eine etwas komfortablere und aufgeräumtere Variante in Python:
edit: Dekodierung in selection_to_file abgeändert, in der Form wird die BOM geschrieben
Im Unterschied zu deinem Code wird hier der explizit selektierte Bereich in eine Tabulatorseparierte Textdatei geschrieben
Karo
Utf8 benötigt doch eigentlich keine BOM oder sehe ich das falsch.
Wie dem auch sei, als Workaround:
Öffne die Datei nach dem speichern nochmal mit einem vernünftigen Editor ( für Windows z.B. Notepad++ unter Linux gehts mit Geany ) und stelle dort ein mit BOM zu speichern.
Zu deinem Code hätte ich eine etwas komfortablere und aufgeräumtere Variante in Python:
edit: Dekodierung in selection_to_file abgeändert, in der Form wird die BOM geschrieben
Code: Alles auswählen
# -*- coding: utf-8 -*-
import uno
import os
import codecs
context = XSCRIPTCONTEXT
ctx = uno.getComponentContext()
servicemanager = ctx.ServiceManager
createUnoService = servicemanager.createInstance
def selection_to_file():
""" Store a single Range-selection into a .tsv-like Textfile
(tsv → Tab Separated Values ) """
doc = context.getDocument()
sourcerange = doc.getCurrentSelection()
source = sourcerange.getDataArray()
filename = FilePicker()
if filename:
lines = [ ]
for row in source:
lines.append( '\t'.join( ['%s' %(elem) for elem in row ] ))
with codecs.open( filename , "w", "utf-8-sig" ) as outfile: # mit BOM 'utf-8-sig' statt 'utf8'
outfile.write( '\n'.join( lines ))
def FilePicker():
filepicker = createUnoService( "com.sun.star.ui.dialogs.FilePicker" )
filepicker.setDisplayDirectory("file:///home/karo/aaa/" )
filepicker.initialize( ( 1,) )
if filepicker.execute():
return uno.fileUrlToSystemPath( filepicker.getFiles()[0] )
def getpath():
folderpicker = createUnoService( "com.sun.star.ui.dialogs.FolderPicker" )
folderpicker.initialize( ( 1,) )
if folderpicker.execute():
return uno.fileUrlToSystemPath( folderpicker.getDirectory())
Karo
Zuletzt geändert von Karolus am Mi, 11.04.2012 18:00, insgesamt 2-mal geändert.
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Re: Datei als UTF-8 mit BOM wegschreiben
Servus
Du könntest mal folgendes versuchen, bevor Du Deine tatsächlichen Inhalte in die Datei schreibst, also vor der Schleife:
Du könntest mal folgendes versuchen, bevor Du Deine tatsächlichen Inhalte in die Datei schreibst, also vor der Schleife:
Code: Alles auswählen
oOutputStream.writeBytes(Array(-17,-69,-65))
Re: Datei als UTF-8 mit BOM wegschreiben
Recht vielen Dank. Das funktioniert so.
Ich habe Basic verwendet weil ich keine Ahnung von Python habe und auch nicht weiß ob Python dann extra installiert sein muß. Aber so klappt es, noch mal veilen Dank.
Ich habe Basic verwendet weil ich keine Ahnung von Python habe und auch nicht weiß ob Python dann extra installiert sein muß. Aber so klappt es, noch mal veilen Dank.
Re: Datei als UTF-8 mit BOM wegschreiben
Hallo
Hätte mich auch gewundert wenn es Python nichts gibt um eiine BOM mit in die Datei zu schreiben, man muss nur die richtige Decodierung finden.
In diesem Fall ist es "utf-8-sig" statt "utf8"
siehe im Code meiner letzten Antwort
Karo
Hätte mich auch gewundert wenn es Python nichts gibt um eiine BOM mit in die Datei zu schreiben, man muss nur die richtige Decodierung finden.
In diesem Fall ist es "utf-8-sig" statt "utf8"
siehe im Code meiner letzten Antwort
Code: Alles auswählen
...
...
with codecs.open( filename , "w", "utf-8-sig" ) as outfile:
...
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)