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

Sehr große strukturlose Textfiles in Matlab einlesen

 

bmtil
Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.11.2016, 16:53     Titel: Sehr große strukturlose Textfiles in Matlab einlesen
  Antworten mit Zitat      
Hallo,
ich möchte sehr große und (scheinbar) unstrukturierte Files in Matlab einlesen. Mit unbekannter Anzahl an Zeilen.
Ich habe die beiden Funtktionen fscanf und textscan gefunden. Jedoch muss man bei beiden Funktionen ein Format der Textfiles vorgeben, in meinem Fall kann ich das nicht tun, weil ich die Anzahl der Zeilen nicht kenne und sich diese auch vom File zur File ändert.
Hier ist die Stelle an der ich nicht weiter komme:

Code:

function voddi_test(graph)

%erstmal nur grapheigenschaften rausgeben
%zum testen der modularität

system_name = extract_system_name(graph);  
file_name = [system_name, '.asm'];
fileID = fopen(file_name, 'a+', 's', 'UTF-8');  
lines_cnt = length(textread(fileID, '&s', 'delimiter', '\n'));  %hier kriege ich die zeilenanzahl nicht      
 code_asm =fscanf(fileID, '%d', '%c' );
 


Meine Fragen sind:
Wie kann ich eine unbekannte Anzahl an Textzeilen vorgeben? Kann ich der textscan Funktion oder der fscanf Funktion bestimmte Strings vorgeben, nach denen diese in den Files suchen sollen?

Vielen Dank und Grüße.

EDIT: hier vllt. die Fehlermeldung die ich bekommen, wenn ich versuche die Zeilen zu zählen:
Code:
Error using exist
The first input to exist must be a string.

Error in textread>noargname (line 191)
   arg = f(arg);

Error in textread (line 158)
if (noargname(@exist,varargin{1}) ~= 2 || noargname(@exist,fullfile(cd,varargin{1})) ~= 2) ...

Error in voddi_test (line 30)
 lines_cnt = length(textread(fileID, '%s', 'delimiter', '\n'))
 


Zuletzt bearbeitet von bmtil am 24.11.2016, 17:06, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.11.2016, 17:06     Titel:
  Antworten mit Zitat      
Hallo,

bei textscan brauchst du die Anzahl der Zeilen nicht anzugeben.
readtable könnte hilfreich sein, weil es die Formate der Spalten errät.

Wenn du 1-2 Dateiausschnitte anhängst, lässt sich leichter was dazu sagen.

Kann sich von Zeile zu Zeile die Anzahl oder das Format der Spalten ändern? Das wäre ein etwas größeres Problem.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bmtil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.11.2016, 17:13     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

bei textscan brauchst du die Anzahl der Zeilen nicht anzugeben.
readtable könnte hilfreich sein, weil es die Formate der Spalten errät.

Wenn du 1-2 Dateiausschnitte anhängst, lässt sich leichter was dazu sagen.

Danke für die Antwort. Hier sind zwei Beispieldateien, eine große und eine kleine. Sind als .zip gepackt, da ich die .asm Dateien nicht hochladen kann. Man kann die aber problemlos mit Notepad++ öffnen.

doc readtable verrät mir nichts.

Harald hat Folgendes geschrieben:

Kann sich von Zeile zu Zeile die Anzahl oder das Format der Spalten ändern? Das wäre ein etwas größeres Problem.


Ja, das Format der Spalten kann von Zeile zur Zeile ändern. Vllt. muss ich nicht das gesamte File einlesen, es würde mir auch reichen, wenn ich mit textscan nach gewissen Wörtern im Text suchen könnte. So wie grep in Linux anscheinend! Schade nur, ich habe 0 Plan von Linux.

Desktop.zip
 Beschreibung:

Download
 Dateiname:  Desktop.zip
 Dateigröße:  263.07 KB
 Heruntergeladen:  302 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.11.2016, 18:11     Titel:
  Antworten mit Zitat      
Hallo,

welche Informationen möchtest du denn aus den Dateien ziehen?

Ich würde zu fgetl in einer while-Schleife tendieren, und dann z.B. mit strfind nach Schlüsselwörtern suchen. Siehe z.B. hier für eine ähnliche Fragestellung:
http://www.gomatlab.de/bestimmte-we.....-und-buendeln-t41191.html

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bmtil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.11.2016, 19:14     Titel:
  Antworten mit Zitat      
Ich möchte nach folgenden Wörtern suchen: "t_XXXX", wobei X jeden Wert zwischen 0 und 9 bzw. A und F, annehmen kann. Dazu habe ich mir ueberlegt diese Funktion zu benutzen:
https://de.mathworks.com/matlabcent.....n--very-fast-grep-utility

strfind hoert sich aber besser an, das werde ich morgen als erstes ausprobieren, habe zu Hause keinen Matlab Zugang.

Grüße.

[EDITED, Jan, Bitte kein Top-Quoting - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
bmtil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.11.2016, 13:50     Titel:
  Antworten mit Zitat      
Ich entschuldige mich für den Doppelpost, leider konnte ich meinen letzten Beitrag nicht editieren. Habe tatsaechlich den Button nicht gefunden.

Ich habe festgestellt, ich habe ein großes Problem mit der gesamten Aufgabe. Mein Ziel ist es eine Variablenreduktion in den .asm Dateien durchzuführen. Die Namen der Variablen, werden dabei an einer anderen Stelle im Projekt erzeugt. Mein Ansatz ist:

1. Zu bearbeitende Datei öffnen -> funktioniert

2. Das Variablenwörtbuch an meine Reduktionsfunktions übergeben -> globals werden ja ungerne gesehen, wie soll ich das machen? -> deswegen habe ich da in meiner Fkt. erstmal die blöde "ich erstelle mir ein Wörterbuch" routine, obwohl das schon merhfach gemacht wurde. Puh.

3. In einer While - Schleife solange textscan ausführen, bis alle Keys des Variablenwörterbuchs markiert sind. -> Dabei soll aber der Text in umgekehrter Zeilenreihenfolge gelesen werden. Mich interessiert immer die Stelle im Code, an der die jeweilige Variable, zum letzten mal gelesen oder geschrieben wurde.

4. In der zweiten While - Schleife werden alle markierten Variablen im "unteren" Code (also dem Teil des Codes, welcher in 3. als erstes durchgelaufen wurde) mit denen Variablennamen (Keys des Wörterbuchs) ersetzt, die zuvor im Code schon verwendet wurden, aber nicht mehr benötigt werden.

Alles in einem ein "kleines" vier - Schritte Programm, kann doch nicht so komplex sein.

Hier bis jetzt das was ich habe, ich versuche das schön Schritt für Schritt zu machen:
Code:
function voddi_test(graph)
%voddi_test wird zu meinem variablenreduktion algorithmus
%erstmal nur grapheigenschaften rausgeben
%zum testen der modularität
%modellnamen anzeigen
system_name = extract_system_name(graph);

variables = containers.Map();
variable = containers.Map();

for name = variables.keys
    variable(name{1}) = true;
end

for node_name = filter_graph(graph, 'Constant', true)
    node = graph(node_name{1});
    for arg = node.arguments
        variables([system_name '/' arg{1}]) = true;
    end
end
variables %-> kann ich immer sehen ob es auch das richtige Wörterbuch ist

file_name = [system_name, '.asm'];
fileID = fopen(file_name, 'a+', 's', 'UTF-8');  
count = 0;

while ~feof(fileID)
      line = fgetl(fileID);
      if isempty(line) || strncmp(line,'t_', 2) || ~ischar(line)  %jede zeile nach 't_' absuchen
          continue
      end
      count = count +1;
end
fprintf('%d lines\n',count);
fclose(fileID);


Die While - Schleife ist erstmal nur zum Testen da, ich möchte mir immer die Anzahl der Zeilen im Code rausgeben lassen, so wie gestern. Ich kriege jetzt zwar keine Fehlermeldung mehr, aber das Ergebnis der Zählung ist trotzdem immer 0.
Grüße.
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 - 2025 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.