WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Suche intelligente Funktion zum Einlesen von .dat Dateien

 

jens.ru
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 19.11.13
Wohnort: Baunach
Version: R2022a
     Beitrag Verfasst am: 11.05.2022, 08:34     Titel: Suche intelligente Funktion zum Einlesen von .dat Dateien
  Antworten mit Zitat      
Ich lese eine .dat Datei ein. Derzeit mittels Verschachtelung von

Code:

string(table2cell(readtable(file.dat,'NumHeaderLines',0,'PreserveVariableNames',true,'ReadVariableNames',false,'EmptyLineRule','read')))


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
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.05.2022, 08:55     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
jens.ru
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 19.11.13
Wohnort: Baunach
Version: R2022a
     Beitrag Verfasst am: 11.05.2022, 09:13     Titel:
  Antworten mit Zitat      
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.

Example.zip
 Beschreibung:

Download
 Dateiname:  Example.zip
 Dateigröße:  665 Bytes
 Heruntergeladen:  250 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.05.2022, 09:39     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
jens.ru
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 19.11.13
Wohnort: Baunach
Version: R2022a
     Beitrag Verfasst am: 11.05.2022, 09:50     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.05.2022, 10:16     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
jens.ru
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 19.11.13
Wohnort: Baunach
Version: R2022a
     Beitrag Verfasst am: 12.05.2022, 13:25     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.