hypnotoad
Anmeldungsdatum: 13. Januar 2007
Beiträge: 95
|
Hi,
was libre office angeht bin ich ein ziemlicher noob, aber ich habe schon das ein oder andere shell script geschrieben, vielleicht mag mir ja jemand helfen. Ich habe 50 libre office Dateien, alles Tabellen, in jeder Datei ist an der gleichen Position ein Datum welches ich überschrieben möchte, also zbsp. in Spalte C Zeile 6 möchte ich den aktuellen Wert mit 01.01.2011 überschreiben. Am liebsten wäre es mir wenn ich das ganze mit einem shell Script lösen könnte. Hat jemand ein paar Zeilen Code für mich? Bearbeitet von Thomas_Do: Tippfehler im Titel korrigiert.
|
micneu
Anmeldungsdatum: 19. Januar 2021
Beiträge: 704
Wohnort: Hamburg
|
Moin, ich habe auch keine Ahnung von LibreOffice, aber meine Empfehlung ist google ein bisschen nach Python. Mein Ansatz wäre das mit Python zu lösen.
Excel Dateien habe ich schon mit Python bearbeitet/erstellt PS: in welchem Datei Format sind die Dateien erstellt?
|
von.wert
Anmeldungsdatum: 23. Dezember 2020
Beiträge: 11739
|
micneu schrieb:
in welchem Datei Format sind die Dateien erstellt?
Er spricht von Tabellen in LibreOffice, also Calc, ergo .ods (OpenDocument Spreadsheet), wenn er's richtig macht.
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4445
Wohnort: Göttingen
|
Hm, hier schonmal ein kurzes Python-Skript, was aber erstmal nur eine Zahl setzt. Das mit Datum hatte ich probiert, das hat aber bisher nicht funktioniert.
Also einige (jetzt auskommentierte) Zeilen sind eigentlich noch für das Datum da:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | #!/usr/bin/env python3
import ezodf
# from datetime import datetime
# Load the existing ODS file
ods_file_path = 'test.ods'
doc = ezodf.opendoc(ods_file_path)
# Get the first sheet (assuming you want to update the first sheet)
sheet = doc.sheets[0]
# Update cell C3 (rows and columns are zero-indexed, so C3 is [2, 2])
cell = sheet[5, 2]
# Set the value type of the cell to 'date' and set the date value
# date_value = datetime(2023, 7, 11).isoformat() # Replace with the desired date (year, month, day)
# cell._set_value_type('date')
# cell.set_value(date_value)
cell.set_value(42)
# Save the updated ODS file
doc.save()
|
Ich habe dafür übrigens auch nur einen Chat-Dienst verwendet.
|
schragge
Anmeldungsdatum: 27. Januar 2022
Beiträge: 181
|
Gnumeric kommt mit dem Befehl ssconvert
ssconvert --set "A1=2011/01/01" in.ods out.ods
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 1214
|
Warum müssen es denn immer neue Programme sein? Du kannst mit der Macro-Sprache von "localc" (Basic/python) oder "excel" (VBA) diese Aufabe doch einfach lösen. Aber du bist nicht auf diese Programme angewiesen. Die Dateien sind ja einfach gezipte Archive, die du per "unzip" entpacken und mit einfachen Script-Mitteln bearbeiten kannst. Beispiel mit xlsx: In "xl/worksheets/" sind die "sheet*.xml" Dateien, die den jeweiligen Arbeitsblättern entsprechen. Jede Zelle ist dort mit einem "<c" Tag markiert. Werte der Zelle mit einem "<v" Tage und Formeln mit "<f" Tag. Wenn also die Zelle "B20" den Wert 530 enthalten soll, steht da
<c r="B20" s="0" t="n"><v>530</v></c>
Lange, wiederverwendbare Zeichenketten stehen in "xl/sharedStrings.xml" und werden in den Zellen indiziert heran gezogen. Mit jedem kleinen XML Tool (oder auch "sed") kannst du die Aufgabe leicht ohne die Programme lösen.
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4658
Wohnort: Berlin
|
Von sed oder irgendwas was kein XML versteht, würde ich aber abraten zur Bearbeitung von XML. Man macht das zu schnell kaputt.
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 1214
|
Marc_BlackJack_Rintsch schrieb: Von sed oder irgendwas was kein XML versteht, würde ich aber abraten zur Bearbeitung von XML. Man macht das zu schnell kaputt.
Dieser Aussage stimme ich zwar prinzipiell zu doch kann man, wenn man weis, worauf man zu achten hat, solch kleine Aktionen mit sed (-z) schon machen. Aber die Gefahr etwas kaputt zu machen ist natürlich größer als wenn man "xmlstarlet" oder "xmllint" einsetzt.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13131
|
shiro schrieb:
"xmlstarlet" oder "xmllint" einsetzt.
Mein bevorzugtes Werkzeug für XML ist Ruby mit Nokogiri.
|
pantomime
Anmeldungsdatum: 20. März 2013
Beiträge: 481
|
Doc_Symbiosis schrieb: Ich habe dafür übrigens auch nur einen Chat-Dienst verwendet.
Meinst du mit Chat-Dienst, dass du für einen "*GPT"-ähnlichen Dienst das Problem beschrieben und eine Frage gestellt hast?
|
pantomime
Anmeldungsdatum: 20. März 2013
Beiträge: 481
|
hypnotoad schrieb: Hat jemand ein paar Zeilen Code für mich?
Ich habe keine fertige Lösung für dich, aber eine Anregung - je präziser du deinen Datensatz, deinen Kontext beschreibst, desto einfacher kann man einen Lösungsansatz und eine robuste Lösung entwickeln. Wenn du statt hypnotoad schrieb: zbsp. in Spalte C Zeile 6 möchte ich den aktuellen Wert mit 01.01.2011 überschreiben.
sagst
hypnotoad schrieb: in Spalte C Zeile 6 möchte ich den aktuellen Wert mit 01.01.2011 überschreiben.
dann entfällt ggf. der Aufwand für die Identifizierung, für das Scannen von/des Kontexts, weil ja dann es nur darum geht, zu programmieren:
in Spalte C Zeile 6 den aktuellen Wert mit 01.01.2011 überschreiben.
. Für mich sieht es in deinem speziellen Fall danach aus, dass es hier weniger auf die Programmiersprache - die zwingend regular expressions beherrschen muss, wenn du bei der Aufgabenstellung beim zbsp. bleibst - ankommt, sondern auf die regular expression, die fehlefrei den Kontext, die zu ändernde Zeichenfolge identifiziert. @hypnotoad Bist du jetzt näher einer Lösung gekommen? Wie sieht deine Lösung aus?
|
juribel
Anmeldungsdatum: 20. April 2014
Beiträge: 1232
|
Der Hinweis von shiro, dass es sich bei LibreOffice-Dateien um gezippte Archive handelt, ist zweifellos richtig. Nicht so gut ist aber der Ansatz, diese Dateien selber mit einem Archivprogramm auszupacken und dann zu bearbeiten. Der richtige ☺ Weg wäre, die Dateien direkt in LibreOffice als "ausgepackte" Dateien zu speichern. Die von LibreOffice dafür vorgesehenen Formate heissen ".fodt" für Writer-Dokumente und ".fods" für Calc-Dokumente. Dabei handelt es sich um "flache" ungezippte XML-Dateien, also reine Textdateien. Diese sind funktional identisch mit ihren gezippten Pendants. Der Benutzer hat damit aber die Wahl, entweder eigene Skripte darauf loszulassen, oder LibreOffice-eigene Bordmittel zu benutzen. Die Dateien sind, weil ungezippt, halt nur entsprechend grösser. Ich benutze diese Formate seit Jahr und Tag, weil ich sie für stabiler halte: beim Speichern und Öffnen sind weniger Schritte notwendig, und es gibt in den Dateien keine Ordnerhierarchien. Alles flat, einfach nur Text.
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4658
Wohnort: Berlin
|
@juribel Ich sehe da nicht so ganz den Unterschied ob man das nun entpackt speichert oder es selbst auspackt, ändert, und natürlich auch wieder einpackt nach dem Ändern. Ein ZIP-Archiv ent- und verpacken ist ja kein besonders fehlerträchtiges Unterfangen.
|
juribel
Anmeldungsdatum: 20. April 2014
Beiträge: 1232
|
Ob das so funktioniert, wäre natürlich auszuprobieren. Aber die "ausgepackten" Formate von LibreOffice zu benutzen, erspart einem nicht nur das Aus- und wieder Einpacken. Wie gesagt, sind die .fodt und .fods-Dateien "flat", also einfache xml-Textdateien, eine einzige Datei pro Dokument. Da gibt es nichts ein- oder auszupacken, und es gibt keine Ordner-Hierarchie mit Dateien, die auf verschiedene Unterverzeichnisse verteilt sind. Das macht das Lesen oder auch Ändern in solchen Dateien erheblich geradliniger und einfacher.
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 1214
|
... und ".fods" für Calc-Dokumente.
Ich stimme der Argumentation von juribel zu. Allerdings bevorzuge ich dennoch das xlsx Format, weil die Benennung der Zellen direkt im Zellen-Tag (<c r=...) abgreifbar ist. Bei dem fods Format muss ich selbst die "<table:table-row" und "<table:table-cell" Einträge zählen um den Zellennamen zu ermitteln (z.B. bei SUM([.B2:.B4])). Dies ist dann eher eine Aufgabe für das mächtige "awk" (bzw die Indizierung von starlet, xmllint oder irgendeine Programmiersprache wie python, ruby oder c++) und nicht für ein "sed" Leichtgewicht.
|