Mehrere Dateien zusammenfügen
Moderator: Moderatoren
Mehrere Dateien zusammenfügen
Hallo,
da die Suche keine Antwort brachte hier meine Frage: ich bin nicht der VBA-Profi, aber gibt es eine Möglichkeit mehrere Dateien in einem Ordner, die alle gleich beginnen, mit einem Script in eine ODS, oder gleich csv-Datei zu packen. Beispiel, ich habe mehrere Tabellendokumente, mit gleicher Spaltenzahl und unterschiedlichen Datensätzen. Alle fangen mit 1305_[...].ods an, für Mai 2013. Die sollen nun alle hintereinander, ohne Leerzeilen in eine neue Datei geschrieben werden, die dann am selben Ort gespeichert werden kann.
Danke schonmal
Gruß crush
Thema nach OOo Basic und Java verschoben, wo alle Themen zur Basic-Programmierung hingehören.—lorbass, Mod
da die Suche keine Antwort brachte hier meine Frage: ich bin nicht der VBA-Profi, aber gibt es eine Möglichkeit mehrere Dateien in einem Ordner, die alle gleich beginnen, mit einem Script in eine ODS, oder gleich csv-Datei zu packen. Beispiel, ich habe mehrere Tabellendokumente, mit gleicher Spaltenzahl und unterschiedlichen Datensätzen. Alle fangen mit 1305_[...].ods an, für Mai 2013. Die sollen nun alle hintereinander, ohne Leerzeilen in eine neue Datei geschrieben werden, die dann am selben Ort gespeichert werden kann.
Danke schonmal
Gruß crush
Thema nach OOo Basic und Java verschoben, wo alle Themen zur Basic-Programmierung hingehören.—lorbass, Mod
Re: Mehrere Dateien zusammenfügen
Morgen,
dieses konvertiert alle Dateien eines Verzeichnisses von ODS in CSV. Diese kannst Du dann auf einer Kommandozeile via "type *.csv > ..\alle.csv" bzw. "cat *.csv > ../alle.csv" zusammen fassen.
Reicht Dir das?
cu, Bernd
--
dieses konvertiert alle Dateien eines Verzeichnisses von ODS in CSV. Diese kannst Du dann auf einer Kommandozeile via "type *.csv > ..\alle.csv" bzw. "cat *.csv > ../alle.csv" zusammen fassen.
Reicht Dir das?
cu, Bernd
--
Code: Alles auswählen
REM ***** BASIC *****
Sub Main
Dim oSFA As Object, oWorkbook As Object
Dim sSrcURL As String, sName As String, sDstURL As String
Dim aListe(), arFilter, Arg()
sSrcURL = convertToURL("e:\test\ooo\")
arFilter = Array( MakePropertyValue( "FilterName", "Text - txt - csv (StarCalc)" ) )
oSFA = createUnoService("com.sun.star.ucb.SimpleFileAccess")
aListe = oSFA.getFolderContents(sSrcURL, false)
for i = 0 to uBound(aListe)
sName = LCase(convertFromUrl(aListe(i))
if Right(sName, 4) = ".ods" Then
oWorkbook = StarDesktop.loadComponentFromURL(aListe(i), "_blank", 0, Arg())
sDstURL = ConvertToURL( Left(sName, Len(sName) - 4) & ".csv")
oWorkbook.storeAsUrl( sDstURL, arFilter )
oWorkbook.close(false)
endif
next
End Sub
Function MakePropertyValue( Optional cName As String, Optional uValue ) As com.sun.star.beans.PropertyValue
Dim oPropertyValue As New com.sun.star.beans.PropertyValue
If Not IsMissing( cName ) Then
oPropertyValue.Name = cName
EndIf
If Not IsMissing( uValue ) Then
oPropertyValue.Value = uValue
EndIf
MakePropertyValue() = oPropertyValue
End Function
Re: Mehrere Dateien zusammenfügen
Danke für deine Bemühungen.
Entschuldige die bl**e Frage, aber ist das jetzt code für ein Macro oder für eine Batch-Datei?
Wenn ich das richtig sehe ist:
ein temporäres Verzeichnis für den Konvertierungsschritt, oder?
Den Rest müsste ich doch so übernehmen können? Dann habe ich nur noch das Problem, dass ich dann immer den Tabellenkopf rauslöschen müsste, der ja am Anfang jeder ods / csv vorhanden ist.
Entschuldige die bl**e Frage, aber ist das jetzt code für ein Macro oder für eine Batch-Datei?
Wenn ich das richtig sehe ist:
Code: Alles auswählen
sSrcURL = convertToURL("e:\test\ooo\")
Den Rest müsste ich doch so übernehmen können? Dann habe ich nur noch das Problem, dass ich dann immer den Tabellenkopf rauslöschen müsste, der ja am Anfang jeder ods / csv vorhanden ist.
Re: Mehrere Dateien zusammenfügen
Hi,
das ist ein Basic Macro. Tue das in irgendeine (andere) ODS-Datei in ein normales Modul und starte es dann von dort.
"e:\test\ooo\" ist der Pfad in dem alle Deine zu wandelnden Dateien liegen müssen, die Ausgabe erfolgt ebenfalls dorthin. Die Datei mit dem Makro sollte besser in einem anderen Ordner liegen.
Schau mal ob das überhaupt bei Dir funktioniert bevor man das dann ggf. noch anpasst.
cu, Bernd
das ist ein Basic Macro. Tue das in irgendeine (andere) ODS-Datei in ein normales Modul und starte es dann von dort.
"e:\test\ooo\" ist der Pfad in dem alle Deine zu wandelnden Dateien liegen müssen, die Ausgabe erfolgt ebenfalls dorthin. Die Datei mit dem Makro sollte besser in einem anderen Ordner liegen.
Schau mal ob das überhaupt bei Dir funktioniert bevor man das dann ggf. noch anpasst.
cu, Bernd
Re: Mehrere Dateien zusammenfügen
Kann meinen letzten Beitrag nicht editieren, da ich nicht eingeloggt war, deswegen doppelpost:
Wenn ich im Makro-Editor das Programm mit F5 durchlaufen lasse, kommt der Fehler nicht, und die ODS wird korrekt in eine CSV konvertiert. Den Fehler bekomme ich nur, wenn ich das Makro mit einer Schaltfläche aus dem Tabellenblatt starte.
Klappt auch mit mehreren Dateien. Kann man der Convert-Funktion noch mitgeben, dass als Feldtrenner ein Semikolon statt Komma verwendet werden soll?
Gruß crush
Wenn ich im Makro-Editor das Programm mit F5 durchlaufen lasse, kommt der Fehler nicht, und die ODS wird korrekt in eine CSV konvertiert. Den Fehler bekomme ich nur, wenn ich das Makro mit einer Schaltfläche aus dem Tabellenblatt starte.
Klappt auch mit mehreren Dateien. Kann man der Convert-Funktion noch mitgeben, dass als Feldtrenner ein Semikolon statt Komma verwendet werden soll?
Gruß crush
Re: Mehrere Dateien zusammenfügen
Hallo
Starte `Main` über die Schaltfläche nicht die Funktion `MakePropertyValue`
Karolus
Starte `Main` über die Schaltfläche nicht die Funktion `MakePropertyValue`
Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Re: Mehrere Dateien zusammenfügen
Nochmals Hi,
versuche das mal so.
HTH, Bernd
--
versuche das mal so.
HTH, Bernd
--
Code: Alles auswählen
REM ***** BASIC *****
Sub Main
Dim oSFA As Object, oWorkbook As Object
Dim sSrcURL As String, sName As String, sDstURL As String
Dim aListe(), Arg()
Dim arFilter(1) As New com.sun.star.beans.PropertyValue
sSrcURL = convertToURL("e:\test\ooo\")
arFilter(0).Name = "FilterName"
arFilter(0).Value = "Text - txt - csv (StarCalc)"
arFilter(1).Name = "FilterOptions"
arFilter(1).Value = "59,0,0,1"
' Parameter fuer FilterOptions:
' (1) ASCII-Wert Trennzeichen 59 = ;
' (2) ASCII-Wert Stringbegrenzer, 0 = kein, 34 wäre "
' (3) Zeichensatz, 0 = Standard
' (4) Startzeile
oSFA = createUnoService("com.sun.star.ucb.SimpleFileAccess")
aListe = oSFA.getFolderContents(sSrcURL, false)
for i = 0 to uBound(aListe)
sName = LCase(convertFromUrl(aListe(i))
if Right(sName, 4) = ".ods" Then
oWorkbook = StarDesktop.loadComponentFromURL(aListe(i), "_blank", 0, Arg())
sDstURL = ConvertToURL( Left(sName, Len(sName) - 4) & ".csv")
oWorkbook.storeAsUrl( sDstURL, arFilter )
oWorkbook.close(false)
endif
next
End Sub
Re: Mehrere Dateien zusammenfügen
Hui, das ging schnell. Jetzt klappts. EDIT: auch mit Semikolon...
Ich habe im Netz einen Code gefunden, der mir nur einmal die erste Zeile der CSV Dateien beim Zusammenfügen übernimmt. Aber dafür ist jeder Datensatz doppelt vorhanden:
Also wenn Datei 1 aus Kopfzeile, Zeile 1 und Datei mit Kopfzeile und Zeile 2 besteht, dann ist die Sammeldatei mit Kopfzeile, Zeile 1, Zeile 2, Zeile 1, Zeile 2 gefüllt. Ich sehe gerade den Fehler nicht...
Habe nochmal was getestet. Wenn ich beide Zeilen mit "for" am Anfang getrennt durchlaufen lasse, während die andere auskommentiert ist, bekomme ich einmal nur die Kopfzeile, und im anderen Fall die korrekte Anzahl von Datensätzen.
Ich habe im Netz einen Code gefunden, der mir nur einmal die erste Zeile der CSV Dateien beim Zusammenfügen übernimmt. Aber dafür ist jeder Datensatz doppelt vorhanden:
Also wenn Datei 1 aus Kopfzeile, Zeile 1 und Datei mit Kopfzeile und Zeile 2 besteht, dann ist die Sammeldatei mit Kopfzeile, Zeile 1, Zeile 2, Zeile 1, Zeile 2 gefüllt. Ich sehe gerade den Fehler nicht...
Code: Alles auswählen
@echo off & setlocal
set "Ordner=C:\Users\Desktop\zeiterfassung"
set "Sammel=C:\Users\Desktop\zeiterfassung\alle.csv"
pushd "%Ordner%"
if exist "%Sammel%" del "%Sammel%"
for %%i in (*.csv) do if not exist "%Sammel%" for /f "usebackq delims=" %%z in ("%%i") do if not exist "%Sammel%" echo %%z>"%Sammel%"
for /f "delims=" %%i in ('dir /b /od *.csv') do more +1 "%%i">>"%Sammel%"
popd
Re: Mehrere Dateien zusammenfügen
Hi,
nimm mal für alle.csv ein anderes Verzeichnis. Möglicherweise wird alle.csv denn sonst vom for %%i in (*.csv) ebenfalls 'erwischt'.
Und, um alle CSV-Dateien untereinander zu kopieren sollte M.E. eigentlich auch ein einfaches:
ausreichen. Beachte dass die Zieldatei (bei gleicher Extension) in einem anderen Verzeichnis liegen sollte.
Übrigens, wenn Dir unter Windows die 'bescheidene' Funktionalität von cmd.exe nicht ausreicht könnte man das auch anders lösen:
- mit dem WSH / VBScript
- mit der Powershell
- mit externen (zusätzlich zu installierenden) Unix-Like-Kommandozeilentools
- oder auch - vermutlich etwas aufwendiger - vom OO-Basic-Script aus
cu, Bernd
nimm mal für alle.csv ein anderes Verzeichnis. Möglicherweise wird alle.csv denn sonst vom for %%i in (*.csv) ebenfalls 'erwischt'.
Und, um alle CSV-Dateien untereinander zu kopieren sollte M.E. eigentlich auch ein einfaches:
Code: Alles auswählen
TYPE *.csv > ..\alle.csv
Übrigens, wenn Dir unter Windows die 'bescheidene' Funktionalität von cmd.exe nicht ausreicht könnte man das auch anders lösen:
- mit dem WSH / VBScript
- mit der Powershell
- mit externen (zusätzlich zu installierenden) Unix-Like-Kommandozeilentools
- oder auch - vermutlich etwas aufwendiger - vom OO-Basic-Script aus
cu, Bernd
Re: Mehrere Dateien zusammenfügen
Mhh, da hätte ich auch selbst drauf kommen können, das noch zu probieren. Der Fehler war, dass alle.csv nicht in den selben Ordner darf. Jetzt klappts wie es soll.
Danke für die Hilfe.
Der Parameter 4 für die Startzeile bringt bei mir keine Änderung. Soll das die Startzeile sein, bei der angefangen wird, die ODS zu konvertieren, und alle vorher werden ignoriert?
Gruß crush
Danke für die Hilfe.
Der Parameter 4 für die Startzeile bringt bei mir keine Änderung. Soll das die Startzeile sein, bei der angefangen wird, die ODS zu konvertieren, und alle vorher werden ignoriert?
Gruß crush
Re: Mehrere Dateien zusammenfügen
Moin, neuer Tag, neue Idee.
Kann ich eigentlich die Zeile "sSrcURL = convertToURL("e:\test\ooo\")" dadurch ersetzen, dass ich zur Laufzeit nach dem Pfad gefragt werde, wo die zu verbindenden Dateien liegen? Habe schon was versucht, mit dem Dateiauswahl-Steuerelement, aber ich kries nicht hin, an die Datei, die ausgewählt wurde, heranzukommen. Die Auswahl im Tabellenblatt vor dem Start des Makros würde mir auch reichen. Die Dokumentation bringt mich auch nicht so wirklich weiter, übersichtlich ist anders.
Gruß crush
Kann ich eigentlich die Zeile "sSrcURL = convertToURL("e:\test\ooo\")" dadurch ersetzen, dass ich zur Laufzeit nach dem Pfad gefragt werde, wo die zu verbindenden Dateien liegen? Habe schon was versucht, mit dem Dateiauswahl-Steuerelement, aber ich kries nicht hin, an die Datei, die ausgewählt wurde, heranzukommen. Die Auswahl im Tabellenblatt vor dem Start des Makros würde mir auch reichen. Die Dokumentation bringt mich auch nicht so wirklich weiter, übersichtlich ist anders.
Gruß crush
Re: Mehrere Dateien zusammenfügen
Morgen,
Ich habe das mit der Startzeile nicht probiert. Möglicherweise betrifft das nur das Einlesen einer CSV-Datei.
Zur Auswahl eines Verzeichnisses versuche mal so etwas.
cu, Bernd
--
Ich habe das mit der Startzeile nicht probiert. Möglicherweise betrifft das nur das Einlesen einer CSV-Datei.
Zur Auswahl eines Verzeichnisses versuche mal so etwas.
cu, Bernd
--
Code: Alles auswählen
Sub TestIt
Dim sFolder As String
sFolder = PickFolder("c:\")
if len(sFolder) > 0 then
Print sFolder
end if
End Sub
Function PickFolder(cFolder)
oFolderPickerDlg = createUnoService("com.sun.star.ui.dialogs.FolderPicker")
If Len(cFolder) > 0 Then
oFolderPickerDlg.setDisplayDirectory(ConvertToURL(cFolder))
EndIf
oFolderPickerDlg.execute()
cPickedFolder = oFolderPickerDlg.getDirectory()
PickFolder = ConvertFromURL(cPickedFolder)
End Function
Re: Mehrere Dateien zusammenfügen
Danke vielmals. Klappt wunderbar (habs mit in die letzte "main" eingebaut). Wo finde ich denn eine Zusammenfassung über Funktionen und deren mögliche Parameter, z.B. "createUnoService("com.sun.star.ui.dialogs.FolderPicker")" Wenn man sowas nicht vorgesetzt bekommt, finde ich es nach meiner derzeitigen Informationslage sehr schwierig, auf sowas selbst zu kommen. Ich habe damals ein Komplettes Auswertungstool mit GUI in Matlab programmiert und bin recht fit in C++, SQL, JAVA usw. aber mit StarBasic werd ich irwi nicht so richtig warm... In Matlab konnte ich einen Editor öffnen, habe eine Funktion oder ein Suchwort eingegeben, und habe alle nötigen Infos zu functions bekommen, die ich brauchte um damit klar zu kommen. Alle Makros (z.B. auch DB Abfragen aus einem Tabellenblatt heraus) habe ich mir hier oder anderswo aus dem Netz zusammenkopiert, das kanns ja nicht gewesen sein, würde da gern mehr draus machen.
Gruß crush
Gruß crush
Re: Mehrere Dateien zusammenfügen
Hi,
und bitteschön, gerne.
Lies mal das erste Thema hier im Forum, Stephan's "Informationen zur StarBasic-Programmierung", da findest Du viele Hinweise.
Ich lese außerdem in Foren mit und habe mir das Buch Makros in OpenOffice.org 3 von Thomas Krumbein zugelegt.
http://www.amazon.de/Makros-OpenOffice- ... 3836214385
Ansonsten hilft neben Google auch noch X-Ray.
http://forum.openoffice.org/en/forum/vi ... 20&t=54217
Wenn Du Basic nicht magst könntest Du auch Python benutzen.
cu, Bernd
und bitteschön, gerne.
Lies mal das erste Thema hier im Forum, Stephan's "Informationen zur StarBasic-Programmierung", da findest Du viele Hinweise.
Ich lese außerdem in Foren mit und habe mir das Buch Makros in OpenOffice.org 3 von Thomas Krumbein zugelegt.
http://www.amazon.de/Makros-OpenOffice- ... 3836214385
Ansonsten hilft neben Google auch noch X-Ray.
http://forum.openoffice.org/en/forum/vi ... 20&t=54217
Wenn Du Basic nicht magst könntest Du auch Python benutzen.
cu, Bernd
Re: Mehrere Dateien zusammenfügen
Danke, das hilft schonmal weiter. Die PDF der Übersetzung hatte ich sogar schon, aber das DOC mit den Makros ist natürlich schön zum nachschlagen.
Ich versuche gerade die URL des Dokumentes zu ermitteln, von dem aus das Makro gestartet wurde. Nachdem ich ein wenig gelesen hatte, dachte ich das würde folgendermaßen funktionieren:
aber ich bekommen nur "Eigenschaft oder Methode nicht gefunden: getURL", die sollte es aber doch geben, oder seh ich das falsch? Muss ich dazu irgendwelche Libaries laden? getURL() funktioniert doch nur bei "Dokument-Komponenten" aber ich dachte, dass mit "oCurDok = ThisComponent" das oCurDok zum Dokument wird...
EDIT: Mit hats funktioniert...
EDIT2: Wie kann ich denn jetzt von dem erhaltenen Pfad die Datei hinten abschneiden und eine neue Datei anhängen?
Ich versuche gerade die URL des Dokumentes zu ermitteln, von dem aus das Makro gestartet wurde. Nachdem ich ein wenig gelesen hatte, dachte ich das würde folgendermaßen funktionieren:
Code: Alles auswählen
[...]
Dim oCurDok As Object
Dim sCurURL As String
oCurDok = ThisComponent
sCurURL = oCurDok.getURL()
Print sCurURL
[...]
EDIT: Mit
Code: Alles auswählen
StarDesktop.getCurrentComponent().getURL()
EDIT2: Wie kann ich denn jetzt von dem erhaltenen Pfad die Datei hinten abschneiden und eine neue Datei anhängen?