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

Txt Datei nur bestimmte Zeile und Wert einlesen

 

Sinalim

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2015, 12:56     Titel: Txt Datei nur bestimmte Zeile und Wert einlesen
  Antworten mit Zitat      
Hallo Leute,

ich bin froh dieses Forum gefunden zu haben. Ich hoffe ihr könnt mir helfen!

Kann ich mit Matlab von mehreren txt Dateien immer den Wert jeder 3. Zeile (8 Werte) und den jeweils den letzten Wert in dieser Zeile auslesen lassen? Diese Werte sollen dann untereinander in einer erneuerten txt Datei gespeichert werden.

Bsp:

Frequency / kHz Port 1 [2] (1)/real
----------------------------------------------------------------------
10 0.51246958

Frequency / kHz Port 2 [2] (1)/real
----------------------------------------------------------------------
10 -1.2819426

Frequency / kHz Port 3 [2] (1)/real
----------------------------------------------------------------------
10 0.51253874

Frequency / kHz Port 4 [2] (1)/real
----------------------------------------------------------------------
10 0.059850663

Frequency / kHz Port 5 [2] (1)/real
----------------------------------------------------------------------
10 0.054006973

Frequency / kHz Port 6 [2] (1)/real
----------------------------------------------------------------------
10 0.029133184

Frequency / kHz Port 7 [2] (1)/real
----------------------------------------------------------------------
10 0.053999922

Frequency / kHz Port 8 [2] (1)/real
----------------------------------------------------------------------
10 0.059943485


ausgelesen werden soll:

0.51246958
-1.2819426
...


es gibt immer mehrer solcher txt Dateien, um genau zu sein,jedes mal 8 Dateien von denen immer jede 3 Zeile und letzter Wert augelesen werden soll.


Alle sollen wie beschrieben nacheinander ausgelesen werden und die Ergebnisse der 8 Dateien sollen in einer Txt Datei untereinander ausgegeben werden.


vielen vielen Dank im Voraus!

liebe Grüße
Sina

einlese.txt
 Beschreibung:

Download
 Dateiname:  einlese.txt
 Dateigröße:  1.5 KB
 Heruntergeladen:  289 mal


Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 24.01.2015, 14:11     Titel:
  Antworten mit Zitat      
Hallo Sina,

In Anlehnung an diesen Thread:
Code:
fid1 = fopen('einlese.txt', 'r');
fid2 = fopen('auslese.txt', 'a');

C = fread(fid1, Inf, '*uint8');

idx         = strfind(C', [13, 10]);    % Zeilenumbrüche finden
start_idx   = [1, idx + 2];             % Zeilenanfang
end_idx     = [idx + 1, size(C,1)];     % Zeilenende + Umbruch

start_idx   = start_idx(3:4:end);       % nur relevante Zeilen
end_idx     = end_idx(3:4:end);

C2 = [];                                % Neues C mit relevanten Zeilen
for ii = 1:size(start_idx, 2)
    C2 = [C2; C(start_idx(ii):end_idx(ii))];
end

C2(C2 == 32) = [];                      % nicht benötigte Zeichen entfernen
C2(1:2) = [];                           % die 10 aus der 1. Spalte entfernen

fseek(fid2, 0, 1);
fwrite(fid2, C2, 'uint8');

fclose(fid1);
fclose(fid2);

Falls in der ersten Spalte nicht immer eine zweistellige Zahl steht, muss das noch angepasst werden.

Um mehrere Dateien einzulesen, ist dir nützlich. Das überlasse ich dir, muss gleich los. Falls es nicht klappt, meld dich noch mal.

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Sinalim

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2015, 15:53     Titel:
  Antworten mit Zitat      
Hallo Seban,


vielen lieben Dank für deine super schnelle Antwort! Smile mit so einer schnellen Antwort habe ich gar nicht gerechnet Surprised

Irgendwo muss aber ein Fehler sein, habe aber leider nicht herausfinden können, woran es liegt.

die auslese.txt sieht nämlich so aus bei mir:

0.51246958
10-1.2819426
100.51253874
100.059850663
100.054006973
100.029133184
100.053999922
100.059943485


da ist also bis auf die erste Zeile überall noch die 10 mit dabei :/

Das mit "dir" schaue ich mir jetzt mal an, danke Smile


liebe Grüße
Sina
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 24.01.2015, 21:57     Titel:
  Antworten mit Zitat      
Hi Sina, gern geschehen.

Die Zeile war natürlich völliger Quatsch, daher war die 10 noch drin. Hab ich in der Eile übersehen.
Code:
C2(1:2) = [];                           % die 10 aus der 1. Spalte entfernen


So funktioniert es:
Code:
fid1 = fopen('einlese.txt', 'r');
fid2 = fopen('auslese.txt', 'a');

C = fread(fid1, Inf, '*uint8');

idx         = strfind(C', [13, 10]);    % Zeilenumbrüche finden
start_idx   = [1, idx + 2];             % Zeilenanfang
end_idx     = [idx + 1, size(C,1)];     % Zeilenende + Umbruch

start_idx   = start_idx(3:4:end);       % nur relevante Zeilen
end_idx     = end_idx(3:4:end);

C2 = [];                                % Neues C mit relevanten Zeilen
for ii = 1:size(start_idx, 2)
    C2 = [C2; C(start_idx(ii):end_idx(ii))];
end

hlp = strfind(C2', [32, 49, 48, 32]);   % die 10 aus der 1. Spalte entfernen
for ii = size(hlp, 2):-1:1
   C2(hlp(ii):hlp(ii)+2) = [];
end

C2(C2 == 32) = [];                      % Leerzeichen entfernen

fseek(fid2, 0, 1);
fwrite(fid2, C2, 'uint8');

fclose(fid1);
fclose(fid2);

Es wird nach ' 10 ' gesucht. Falls in der ersten Spalte auch etwas anderes als eine 10 stehen kann, müsste man das anpassen. regexp wäre eine Möglichkeit, die mir einfällt.

Warst du mit dir erfolgreich?

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Sinalim

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2015, 23:54     Titel:
  Antworten mit Zitat      
Super jetzt funktioniert es prima ! Smile

Leider war ich damit nicht erfolgreich, habs dann irgendwann aufgegeben :/

Würde mir ungemein viel Arbeit ersparen, wenn ich voll automatisch jedesmal die 8 Dateien so einlesen und in einer einzigen Txt Datei alles direkt untereinander so in dem Stil ausgeben lassen könnte.

Liebe Grüße
Sina
 
Sinalim

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2015, 23:58     Titel:
  Antworten mit Zitat      
ups, habe vergessen zu erwähnen, dass eine Anpassung wegen der 10 nicht nötig sein wird -) wird immer eine Zahl zwischen 10 und 20 sein Smile
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 25.01.2015, 03:52     Titel:
  Antworten mit Zitat      
Code:
dir_info = dir('*.txt');
log_aus  = ismember({dir_info.name}, 'auslese.txt');
dir_info(log_aus) = [];

fidA = fopen('auslese.txt', 'a');

for jj = 1:size(dir_info, 1)
   
    C = fileread(dir_info(jj).name);
   
    idx         = strfind(C, char([13, 10]));   % Zeilenumbrüche finden
    start_idx   = [1, idx + 2];                 % Zeilenanfang
    end_idx     = [idx + 1, size(C,1)];         % Zeilenende + Umbruch
   
    start_idx   = start_idx(3:4:end);           % nur relevante Zeilen
    end_idx     = end_idx(3:4:end);
   
    C2 = [];                                    % Neues C mit relevanten Zeilen
    for ii = 1:size(start_idx, 2)
        C2 = [C2, C(start_idx(ii):end_idx(ii))];
    end
   
    C3 = regexprep(C2, '(\040)+(\d)+(\040)+', '');  % Unrat entfernen
   
    fseek(fidA, 0, 1);
    fwrite(fidA, C3);
end

fclose(fidA);


Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Sinalim

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.01.2015, 11:35     Titel:
  Antworten mit Zitat      
ich bin wirklich sprachlos Seban, du weißt gar nicht, wie dankbar ich dir gerade bin !

es funktioniert reibungslos, einfach genial! und das hast du einfach mal so schnell hinbekommen, Hut ab Smile


ich bin wirklich sehr sehr dankbar, hast mir eine Menge arbeit dadurch erspart, jetzt muss ich nicht jede einzelne Datei manuell bearbeiten und dann durch copy&paste zusammenführen. Das geniale ist, dass dein Code nicht begrenzt ist auf 8 Wete bzw. 8 Dateien, sondern auch mit mehr funktioniert!

Smile Smile Smile

liebe liebe Grüße
Sina
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 25.01.2015, 14:47     Titel:
  Antworten mit Zitat      
Freut mich, geholfen zu haben Smile
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Sinalim

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.01.2015, 17:26     Titel:
  Antworten mit Zitat      
Hallo Seban,

ich möchte deinen Code gerne richtig verstehen, habe aber dabei Schwierigkeiten. Wärst du so lieb, und würdest zu den Einzelnen Zeilen mehr dazu schreiben? Wäre super von dir Smile

liebe Grüße
Sina
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 26.01.2015, 19:16     Titel:
  Antworten mit Zitat      
Hi Sina,

Gegenvorschlag: Sag mir was du nicht verstehst, dann erkläre ich dir das. Ist weniger Arbeit, als wenn ich jetzt jede Zeile beschreibe.

Wenn du auf die blau markierten Befehle klickst, gelangst du direkt zur Matlab-Hilfe des Befehls. Auch der Debugger kann hilfreich beim Verstehen von Code sein, siehe dazu in meine Signatur.

Beste Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Sinalim

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2015, 14:17     Titel:
  Antworten mit Zitat      
Hey Seban,

vielen Dank für den Tipp mit den blau markieren Befehlen. Ich komme auf dich zurück, falls dennoch was unverständlich sein sollte Smile

dein Code ist bei mir im Dauereinsatz..vielen vielen Dank nochmals!


lg
Sina
 
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.