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

Konst. Wert in txt finden und durch Variable ersetzen

 

Quadder
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 10.07.16
Wohnort: Hamburg
Version: 2016a
     Beitrag Verfasst am: 10.07.2016, 08:48     Titel: Konst. Wert in txt finden und durch Variable ersetzen
  Antworten mit Zitat      
Hallo Community,

ich habe mich bisher nicht tiefergehend mit Matlab auseinandergesetzt, sondern das Programm nur für einfache Sachen genutzt.
Jetzt stehe ich vor einem Problem, wo mir die Programmierkenntnisse fehlen und ich hoffe ihr könnt mir weiterhelfen!

Problemstellung:
- Es liegt eine .txt-Datei vor, die sowohl Zeichen als auch Zahlen beinhaltet und über mehrere Seiten geht. Es soll ein bestimmter und konstanter Wert '$VEL.CP = 0.01' gesucht werden und durch eine Variable ersetzt werden. Die Variable A soll einer Tabelle entnommen und nach jedem Änderungsschritt auf den Wert der nächsten Zeile der Tabelle geändert werden.

Beispiel:
Eingang: Dies ist ein $VEL.CP = 0.01 beispiel Text mit $VEL.CP = 0.01 Werten.
Ausgang: Dies ist ein $VEL.CP = 0.01234 beispiel Text mit $VEL.CP = 0.07575 Werten.

Mein Code bis jetzt, was quasi der Suche&Ersetze Funktion vom Wordpad entspricht...

Code:
T = readtable('Geschwindigkeit.xlsx');
A = table2array(T(1,:));


fidInFile = fopen('Eingang.txt','r');              %# Open input file for reading
fidOutFile = fopen(['new_' 'Ausgang.txt'],'w');    %# Open output file for writing
nextLine = fgets(fidInFile);                %# Get the first line of input
while nextLine >= 0                         %# Loop until getting -1 (end of file)
  nextLine = strrep(nextLine,'$VEL.CP = 0.01',sprintf('$VEL.CP = %.6f', A));  %# Replace
  fprintf(fidOutFile,'%s',nextLine);        %# Write the line to the output file
  nextLine = fgets(fidInFile);              %# Get the next line of input
end
fclose(fidInFile);                          %# Close the input file
fclose(fidOutFile);                         %# Close the output file


Es fehlt die Umsetzung aus der Tabelle eine sich automatisch ändernde double zu machen.

Vielen Dank für eure Unterstützung und schönen Sonntag!

Markus
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: 10.07.2016, 09:21     Titel:
  Antworten mit Zitat      
Hallo,

wenn ich das richtig verstehe:

vor der Schleife:
Code:


am Anfang der while-Schleife:
Code:
A = T{row,:};


am Ende der for-Schleife:
Code:
row = row + 1;


Ist sichergestellt, dass die Anzahl der Zeilen in der Excel-Datei mit der Anzahl zu ersetzender Zeilen in der Textdatei übereinstimmt?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 10.07.16
Wohnort: Hamburg
Version: 2016a
     Beitrag Verfasst am: 10.07.2016, 09:46     Titel:
  Antworten mit Zitat      
Hallo Harald,

super Ansatz auf den ich einfach nicht gekommen bin.
Als ich dachte das damit das Problem schon gelöst sei, ist mir aufgefallen das mit meiner Schleife ja jede Zeile abgefragt wird und damit auch 'row' jedes mal einen hochgesetzt wird.
Ergebnis in meinem Minimalbeispiel ist, dass ich die Geschwindigkeit in Zeile vier im Text durch den Wert aus der Tabelle Zeile vier ersetze, wobei dort eigentlich das erste mal etwas mit dem Wert auf Tabelle Zeile eins ersetzt werden soll.

Anzahl der Zeilen in der Excel-Datei soll vorerst gleich der Anzahl der zu ersetzenden Zeilen in der Textdatei sein. Aber es befinden sich noch weitaus mehr Zeilen in der Textdatei die nicht ersetzt werden soll.
Bsp. Zeilen Text 4000, Zeilen im Text die ersetzt werden sollen 90, Zeilen in Tabelle 90.


Wie kann ich in der Schleife ändern, dass der Zähler nicht zeilenweise hochgesetzt wird, sondern nur wenn Wert in Zeile geändert wurde?
if Bedingung? == true
row = row + 1
else
row = row?
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: 10.07.2016, 10:22     Titel:
  Antworten mit Zitat      
Hallo,

wie wäre es mit
Code:
newNextLine = strrep(nextLine,'$VEL.CP = 0.01',sprintf('$VEL.CP = %.6f', A));
if ~strcmp(newNextLine, nextLine)
row = row + 1;
end


Alternativ werden die Zeilen ja durch die Ersetzung länger. Man könnte also die Anzahl der Zeichen vor und nach der Ersetzung vergleichen. Falls Performance wichtig ist, könnte das etwas bringen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 10.07.16
Wohnort: Hamburg
Version: 2016a
     Beitrag Verfasst am: 10.07.2016, 12:35     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für die Lösung! Ich habe es eben durchlaufen lassen und bislang keine Probleme hinsichtlich Rechenzeit. Ich behalte das mit der Performance mal im Hinterkopf, da ich das Programm noch erweitern möchte.

strcmp kannte ich noch nicht und hat vviel Potential für meine weiteren Überlegungen.

Vielen Dank nochmal!
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.