|
|
Suche intelligente Funktion zum Einlesen von .dat Dateien |
|
jens.ru |
Forum-Anfänger
|
|
Beiträge: 34
|
|
|
|
Anmeldedatum: 19.11.13
|
|
|
|
Wohnort: Baunach
|
|
|
|
Version: R2022a
|
|
|
|
|
|
Verfasst am: 11.05.2022, 08:34
Titel: Suche intelligente Funktion zum Einlesen von .dat Dateien
|
|
|
|
|
Ich lese eine .dat Datei ein. Derzeit mittels Verschachtelung von
Mein Problem bei der Konstellation ist, dass hierbei die Formatierung zerstört wird. Die Datei beinhaltet einen 15zeiligen Header, danach folgen 300-400 sehr ähnliche Blöcke aus 4 Zeilen, die ich nach Fallunterscheidung entweder behandle, oder nicht. Ein Block beginnt mit einem Schlüsselwort, danach folgen drei Zeilen, die mittels Tabulator eingerückt sind, die auch Anführungsstriche beinhalten. Die ersten drei Zeilen enden jeweils mit einem '\'.
Beispiel:
Schlüsselwort text text text \
text datum=11.05.2023 text \
text text="hexadezimale Zeichenfolgen \
hexadezimale Zahlenfolgen"
Leerzeile
Ich müsste sämtliche Leerzeichen und Tabulatoren, die in dem File sind übernehmen, allerdings sind die bei der derzeitigen Lösung weg. Leerzeichen werden gelöscht, Tabulatoren sorgen dafür, dass die drei untergeordneten Zeilen in Spalte B angeordnet werden, was bei einer erneuten Zusammensetzung des Files zu einer völligen Zerstörung des Layouts führt. Aktuell habe ich als Delimiter einfach '' definiert. Das führt dazu, dass wenigstens die Reihenfolge des Files beibehalten wird, aber die Formatierung eben nicht passt.
Welche Möglichkeiten fallen spontan ein?
Besten Dank im Voraus
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 11.05.2022, 08:55
Titel:
|
|
Hallo,
Tables und somit readtable erscheint mir hier nicht geeignet, weil die Daten nicht wirklich tabellarisch in dem Sinne (spaltenorientiert, gleicher Datentyp in allen Spalten) sind. Es kann das beste sein, eine eigene Funktion zu schreiben, die die Datei block- bzw. zeilenweise durchgeht (
fopen
,
fgetl
,
fclose
).
Welche Informationen willst du denn zu jedem Block abspeichern und in welchem Format?
Für weitere Unterstützung bitte eine solche Datei mit ein paar Blöcken anhängen, ggf. gezippt (nicht "nur" hier reinhängen, da z.B. Tabulatoren gerne verloren gehen).
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
jens.ru |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 34
|
|
|
|
Anmeldedatum: 19.11.13
|
|
|
|
Wohnort: Baunach
|
|
|
|
Version: R2022a
|
|
|
|
|
|
Verfasst am: 11.05.2022, 09:13
Titel:
|
|
Besten Dank für die prompte Antwort.
Letztlich will ich eigentlich nur mit einem externen File abgleichen, ob der jeweilige Block existiert, oder nicht. Existiert er: Alles bleibt unverändert, existiert er nicht, kommt ein '#' vor das INCREMENT.
Derzeit lese ich es ein, ersetze alle INCREMENT durch #INCREMENT und gehe dann mit einer Schleife durch um die Änderung zurückzunehmen. (Das hat technische Gründe, diese "umständliche" Bearbeitung zu wählen).
Anbei mal ein stark verkürztes und abgeändertes Muster-File.
Beschreibung: |
|
Download |
Dateiname: |
Example.zip |
Dateigröße: |
665 Bytes |
Heruntergeladen: |
250 mal |
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 11.05.2022, 09:39
Titel:
|
|
Hallo,
Zitat: |
Letztlich will ich eigentlich nur mit einem externen File abgleichen, ob der jeweilige Block existiert, oder nicht. |
Wie ist dieses externe File aufgebaut und wie entscheidest du das? Beispielsweise ausschließlich anhand des Namens (hier Name1, Name2, etc.) oder geht es um den kompletten Block? Können die echten Name Leerzeichen oder Zahlen enthalten? Ist die Versionsnummer immer 1.0?
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
jens.ru |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 34
|
|
|
|
Anmeldedatum: 19.11.13
|
|
|
|
Wohnort: Baunach
|
|
|
|
Version: R2022a
|
|
|
|
|
|
Verfasst am: 11.05.2022, 09:50
Titel:
|
|
Naja, es ist ein kleines bisschen komplizierter, als ich es gerade ausgeführt habe.
Es gibt eine ExcelListe, in der in einer Spalte alle INCREMENT name1, name2, etc. aufgeführt sind. In einer anderen Spalte ist dann entweder ein - oder ein x. Wenn da ein - ist, lasse ich INCREMENT eben auskommentiert, wenn nicht, ersetzte ich #INCREMENT wieder durch INCREMENT.
Daher läuft eine Schleife über die Excel-Liste und setzt addIncrement eben auf false oder true.
Gewählt wird es ausschließlich über den Namen, hier gehe ich davon aus, dass die Namen konsistent sind und sich nicht ändern. Echte Namen können keine Leerzeichen enthalten, Zahlen hingegen schon. Ob die Versionsnummer immer 1.0 ist, ist nicht gesichert.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 11.05.2022, 10:16
Titel:
|
|
Hallo,
so kompliziert erscheint es mir nun auch nicht, quasi im Gegenteil. Was ich machen würde:
1. Excel-Datei einlesen. Per logischer Indizierung die "INCREMENT name_x" extrahieren, die in der anderen Datei ersetzt werden sollen.
2. Die .dat-Datei komplett mit
fileread
einlesen, dann
replace
verwenden, um "INCREMENT name_x" durch "#INCREMENT name_x" zu ersetzen. Dann die Datei mit
fprintf
rausschreiben (zunächst in eine neue Datei, langfristig nach Wunsch überschreiben).
Für weitere Unterstützung bitte die beispielhafte Excel-Datei anhängen. Letztlich sollte der Code ca. 10-15 Zeilen lang sein.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
jens.ru |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 34
|
|
|
|
Anmeldedatum: 19.11.13
|
|
|
|
Wohnort: Baunach
|
|
|
|
Version: R2022a
|
|
|
|
|
|
Verfasst am: 12.05.2022, 13:25
Titel:
|
|
Hi Harald,
besten Dank für deine Hilfe!
Ich habe jetzt eine relativ einfache und naheliegende Lösung gewählt und die auf INCREMENT folgenden Zeilen mittels sprintf('\t') um einen Tab ergänzt, sofern diese nicht leer sind, oder schon Schlüsselwörter enthalten.
Scheint so zu funktionieren, daher verzichte ich jetzt auf ein umstellen auf fileread.
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2024
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|