Mehrere Dateien zusammenfügen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

crush
**
Beiträge: 36
Registriert: Mo, 26.03.2012 08:19

Mehrere Dateien zusammenfügen

Beitrag von crush »

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
 
bst
*****
Beiträge: 222
Registriert: Mo, 18.01.2010 16:14
Wohnort: Ilsfeld

Re: Mehrere Dateien zusammenfügen

Beitrag von bst »

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
--

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 
crush
**
Beiträge: 36
Registriert: Mo, 26.03.2012 08:19

Re: Mehrere Dateien zusammenfügen

Beitrag von crush »

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:

Code: Alles auswählen

sSrcURL = convertToURL("e:\test\ooo\")
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.
bst
*****
Beiträge: 222
Registriert: Mo, 18.01.2010 16:14
Wohnort: Ilsfeld

Re: Mehrere Dateien zusammenfügen

Beitrag von bst »

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
crush
**
Beiträge: 36
Registriert: Mo, 26.03.2012 08:19

Re: Mehrere Dateien zusammenfügen

Beitrag von crush »

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
Karolus
********
Beiträge: 7443
Registriert: Mo, 02.01.2006 19:48

Re: Mehrere Dateien zusammenfügen

Beitrag von Karolus »

Hallo
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)
bst
*****
Beiträge: 222
Registriert: Mo, 18.01.2010 16:14
Wohnort: Ilsfeld

Re: Mehrere Dateien zusammenfügen

Beitrag von bst »

Nochmals Hi,

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
crush
**
Beiträge: 36
Registriert: Mo, 26.03.2012 08:19

Re: Mehrere Dateien zusammenfügen

Beitrag von crush »

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...

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
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.
bst
*****
Beiträge: 222
Registriert: Mo, 18.01.2010 16:14
Wohnort: Ilsfeld

Re: Mehrere Dateien zusammenfügen

Beitrag von bst »

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:

Code: Alles auswählen

TYPE *.csv > ..\alle.csv
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
crush
**
Beiträge: 36
Registriert: Mo, 26.03.2012 08:19

Re: Mehrere Dateien zusammenfügen

Beitrag von crush »

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
crush
**
Beiträge: 36
Registriert: Mo, 26.03.2012 08:19

Re: Mehrere Dateien zusammenfügen

Beitrag von crush »

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
bst
*****
Beiträge: 222
Registriert: Mo, 18.01.2010 16:14
Wohnort: Ilsfeld

Re: Mehrere Dateien zusammenfügen

Beitrag von bst »

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
--

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 
crush
**
Beiträge: 36
Registriert: Mo, 26.03.2012 08:19

Re: Mehrere Dateien zusammenfügen

Beitrag von crush »

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
bst
*****
Beiträge: 222
Registriert: Mo, 18.01.2010 16:14
Wohnort: Ilsfeld

Re: Mehrere Dateien zusammenfügen

Beitrag von bst »

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
crush
**
Beiträge: 36
Registriert: Mo, 26.03.2012 08:19

Re: Mehrere Dateien zusammenfügen

Beitrag von crush »

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:

Code: Alles auswählen

[...]
Dim oCurDok As Object
Dim sCurURL As String

oCurDok = ThisComponent
sCurURL = oCurDok.getURL()
Print sCurURL
[...]
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

Code: Alles auswählen

StarDesktop.getCurrentComponent().getURL()
hats funktioniert...


EDIT2: Wie kann ich denn jetzt von dem erhaltenen Pfad die Datei hinten abschneiden und eine neue Datei anhängen?
Antworten