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

Auslesen einer txt mit leeren Zeilen

 

Henrik123
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 25.01.2017, 11:36     Titel: Auslesen einer txt mit leeren Zeilen
  Antworten mit Zitat      
Hallo. Ich habe eine Frage zum auslesen einer Textdatei. Ich habe das Forum schon durchsucht, fand aber leider keine passende Lösung für mein Problem. Habe erst vor kurzem mit Matlab angefangen.

Die Textdatei besteht aus einem Header und anschließend folgen 1024 Zeilen mit Daten gefolgt von drei Abschlusszeilen. Dieser ganze Block wiederholt sich innerhalb der Textdatei. Ich habe eine Textdatei im Anhang beigefügt.

Zum auslesen benutze ich folgenden Code:

Code:

clear all;                                                  
filename = ['Stepped_Sine.txt'];
A = importdata(filename);


Das Problem an der Sache ist, es sollten 6204 Zeilen eingelesen werden. Es befinden sich 6 Blöcke in der Datei.

6 x 7 Zeilen für den Header
6 x 1024 Zeilen für die Daten
6 x 3 Zeilen für das Ende des Blockes

Das wären 6204 Zeilen. Er ließt aber nur 6192 Zeilen ein. Die Funktion überspringt einfach die leeren Zeilen in der Datei. Das sind genau 12 Zeilen. Wie kann ich die Zeilen mit lesen. Unglücklicherweise heißt das, die Funktion schneidet die letzten 12 Zeilen einfach ab. Die Zeilen 6192 bis 6201 enthalten aber noch Daten.

Kann mir vielleicht jemand weiterhelfen wie ich die Datei richtig einlese?

Mit freundlichem Gruß

Henrik Schädlich

Stepped_Sine.txt
 Beschreibung:
Daten der Messung mit den sich wiederholenden Blöcken.

Download
 Dateiname:  Stepped_Sine.txt
 Dateigröße:  628.55 KB
 Heruntergeladen:  1643 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

mit Rechtsklick --> Import Data oder über den textscan-Befehl hast du mehr Einstellungsmöglichkeiten.

Falls du mit textscan arbeitest, darauf achten, dass zunächst die Dezimalkommas in Dezimalpunkte umgewandelt werden.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 25.01.2017, 12:14     Titel:
  Antworten mit Zitat      
Mir ist nicht ganz klar was du meinst. Ich kann natürlich die Funkiton importdata aufrufen und den Quellcode ändern. Damit kenne ich mich aber noch weniger aus. Meintest du das?

Mein komplettes Programm zum Einlesen sieht so aus.

Code:

clear all;
%--------------------Define variables here!!!-----------------------------%

%---folder which includes the measured data---%          
Folder = 'D:\50µm_Folie\';

%---measured frequencies---%
   freq = {125,250,500,1000,1500,2000};

%---measured positions---%
pos = {3.9,8.9,11.0,16.1,20.4,21.1,24.7,30.8}                                  

%---amount of measured points---%
NumberOfSteps = length(pos)                                              

%---table dimension of output data---%
height=2*length(freq)+1
Aton=zeros(NumberOfSteps,height)                                          

for i = 1:NumberOfSteps                                                  
    filename = [Folder 'Point' num2str(i) '\Stepped_Sine.txt'];
    A = importdata(filename,delimiterIn);                                
   
   
%---Matrix for first measurment block in the txt.---%
    for ii = 8:1:1031                                                      
        B{ii-7,1}=A{ii,1};                                                
        B{ii-7,1}=strrep(B{ii-7,1},',','.');                            
        C(ii-7,:)=strread(B{ii-7,1},'%s');  
    end
    A1=str2double(C);  
   
%---Repetition for second block in the txt.---%    
    for ii = 1042:1:2065                                                                          
        B{ii-1041,1}=A{ii,1};
        B{ii-1041,1}=strrep(B{ii-1041,1},',','.');                                                  
        C(ii-1041,:)=strread(B{ii-1041,1},'%s');                                                    
    end
    A2=str2double(C);                                                      
 
%---Repetition for third block in the txt.---%
    for ii = 2076:1:3099                                                                          
        B{ii-2075,1}=A{ii,1};
        B{ii-2075,1}=strrep(B{ii-2075,1},',','.');                                                  
        C(ii-2075,:)=strread(B{ii-2075,1},'%s');                                                    
    end
    A3=str2double(C);    
   
%---Repetition for fourth block in the txt.---%  
    for ii = 3110:1:4133                                                                          
        B{ii-3109,1}=A{ii,1};
        B{ii-3109,1}=strrep(B{ii-3109,1},',','.');                                                  
        C(ii-3109,:)=strread(B{ii-3109,1},'%s');                                                    
    end
    A4=str2double(C);  
   
%---Repetition for fifth block in the txt.---%  
    for ii = 4144:1:5167                                                                          
        B{ii-4143,1}=A{ii,1};
        B{ii-4143,1}=strrep(B{ii-4143,1},',','.');                                                  
        C(ii-4143,:)=strread(B{ii-4143,1},'%s');                                                    
    end
    A5=str2double(C);  
   
%---Repetition for sixth block in the txt.---%  
    for ii = 5178:1:6192                                                                          
        B{ii-5177,1}=A{ii,1};
        B{ii-5177,1}=strrep(B{ii-5177,1},',','.');                                                  
        C(ii-5177,:)=strread(B{ii-5177,1},'%s');                                                    
    end
    A6=str2double(C);                                                      
 


Das ist nur eine vorläufige Version. Will die Blöcke noch in eine Schleife legen. Allerdings kann ich den Fehler mit den leeren Zeilen nicht behenbe.

Gruß Henrik
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 25.01.2017, 12:22     Titel:
  Antworten mit Zitat      
Sobald ich im letzten Block i bis 6204 laufen lasse, funktioniert das Programm nicht mehr. Die eingelesene Variable A hat auch nur 6192 Zeilen und nicht 6204.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.01.2017, 12:25     Titel:
  Antworten mit Zitat      
Hallo,

dein Code sieht sehr (und unnötig) kompliziert aus.

Zitat:
Ich kann natürlich die Funkiton importdata aufrufen und den Quellcode ändern. Damit kenne ich mich aber noch weniger aus. Meintest du das?

Nein. Rechtsklick auf die Datei im Current Folder Browser und Import Data auswählen. Dort kannst du interaktiv zusammenstellen, was du benötigst, und auch ein Skript oder eine Funktion generieren.

Ansonsten wie gesagt textscan.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 25.01.2017, 13:06     Titel:
  Antworten mit Zitat      
Ok da kann ich immerhin schonmal die Zeilen ändern und die Funktion gleich mitnehmen. Klasse. Super Tipp.

Ich bin noch relativ neu im Forum und arbeite erst seit kurzem damit also erwarte nicht zu viel. Wenn du konstruktive Vorschläge hast, höre ich mir die gerne weiter an. Einfach nur "unnötig" und "zu kompliziert" nützt gar nichts und niemandem.

Ich freue mich auf weitere Tipps.

Gruß Henrik
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.01.2017, 14:13     Titel: Re: Auslesen einer txt mit leeren Zeilen
  Antworten mit Zitat      
Hallo Henrik123,

importdata ist smart. Ich mag es lieber einfach:
Code:
fid = fopen(FileName, 'r');
if fid == -1
  error('Cannot open file %s', FileName);
end

nBlocks = 6;
nHead = 7;
nData = 1024;
nValue = 9;
nSep = 3;

Result = zeros(nValue, nData, nBlock);

for iBlock = 1:nBlock
  for iHead = 1:nHead;
    fgetl(fid);  % Ignore header lines
  end

  for iData = 1:nData
    S = fgetl(fid);
    S = strrep(S, ',', '.');
    Value = sscanf(S, '%g', [nValue, 1]);
    Result(:, iData, iBlock) = Value;
  end

  for iSep = 1:nSep
    fgetl(fid);
  end
end

fclose(fid);

Das sollte eines der Files erfolgreich und effizient einlesen.

Viele Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 25.01.2017, 14:21     Titel:
  Antworten mit Zitat      
Besten Dank, da klemme ich mich hinter. Das hilft mir sehr mit dem Programm zu arbeiten.

Ich melde mich sollten noch Fragen aufkommen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 25.01.2017, 15:58     Titel:
  Antworten mit Zitat      
Die Programmstruktur ist mir soweit klar. Zu erst Header Überspringen, dann die 1024 Zeilen einlesen und Kommazeichen ersetzen. Der gelesen Wert Value wird an entsprechende Stelle in Result eingefügt. Anschließend drei Zeilen überspringen und in den nächsten Block gehen. Die Lösung ist echt super.

Beim obigen Skript ist mir dann aber aufgefallen, dass möglicherweise ein Fehler in der Dimension besteht. Es sind nicht 1024 Zeilen definiert worden.

Code:
Result = zeros(nValue, nData, nBlocks);
Müsste es dann nicht heißen:

Code:

fid = fopen(FileName, 'r');
if fid == -1
  error('Cannot open file %s', FileName);
end

nBlocks = 6;
nHead = 7;
nData = 1024;
nValue = 9;
nSep = 3;

Result = zeros(nData, nValue, nBlocks);

for iBlock = 1:nBlocks
  for iHead = 1:nHead;
    fgetl(fid);  % Ignore header lines
  end

  for iData = 1:nData
    S = fgetl(fid);
    S = strrep(S, ',', '.');
    Value = sscanf(S, '%g', [1, nValue]);
    Result(iData,:, iBlock) = Value;
  end

  for iSep = 1:nSep
    fgetl(fid);
  end
end

fclose(fid);
 


Ich bekomme es leider nicht zum laufen. Sad Er hat noch ein Problem mit der Dimension. Hast du noch eine Idee.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.01.2017, 16:12     Titel:
  Antworten mit Zitat      
Hallo,

bei mir läuft der von dir gepostete Code durch und liefert auf den ersten Blick sinnvolle Ergebnisse.

Bitte kopiere die Fehlermeldung inkl. Zeilennummer und andere Informationen, die erklären könnten, warum der Code bei dir nicht durchläuft, bei mir aber schon (z.B. verwendetes Release).

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 25.01.2017, 16:18     Titel:
  Antworten mit Zitat      
Ok ich habe es ^^ Sorry.

Ich habe es falsch gesehen. Es sind 1024 Spalten und 9 Zeilen bei 6 Blöcken. Ich arbeite mit Matlabl R2011a. Nur so am Rand, sagen wir einmal ich hätte gerne 9 Spalten und 1024 Zeilen mit 6 Blöcken. Wie gehe ich da vor?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.01.2017, 16:23     Titel:
  Antworten mit Zitat      
Hallo Henrik123,

Zitat:
Beim obigen Skript ist mir dann aber aufgefallen, dass möglicherweise ein Fehler in der Dimension besteht. Es sind nicht 1024 Zeilen definiert worden.

Ich denke, es war schon richtig:

Code:
nBlocks = 6;
nData = 1024;
nValue = 9;
Result = zeros(nValue, nData, nBlocks);

Jetzt wird jeweils ein Block von nValue Zahlen pro Zeile eingelesen, das nData mal für alle nBlocks:
Code:
Result(:, iData, iBlock) = Value;

X(:, a,b) greift auf die erste Dimension des Array zu, wobei nebeneinander liegende Bytes im Ram addressiert werden. Das ist effizienter als X(a, :, b) . Wenn Du nach dem Einlesen die Dimensionen vertauschen willst, geht das mit:
Code:
Result = permute(Result, [2,1,3])


Zitat:
Ich bekomme es leider nicht zum laufen. :( Er hat noch ein Problem mit der Dimension. Hast du noch eine Idee.

Bitte poste dann die vollständige Fehlermeldung. Beim ungefähren Nacherzählen gehen oft wichtige Details verloren.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 25.01.2017, 16:38     Titel:
  Antworten mit Zitat      
So läuft es super. Der Tipp mit permute ist genau was ich gesucht habe.

Die Fehlermeldung kam nur weil ich versucht habe dein Skript umzuschreiben und die Dimension anzupassen. Aber so scheint es auch zu funktionieren.
Code:
fid = fopen(FileName, 'r');
if fid == -1
  error('Cannot open file %s', FileName);
end

nBlocks = 6;
nHead = 7;
nData = 1024;
nValue = 9;
nSep = 3;

Result = zeros(nData, nValue, nBlocks);

for iBlock = 1:nBlocks
  for iHead = 1:nHead;
    fgetl(fid);  % Ignore header lines
  end

  for iData = 1:nData
    S = fgetl(fid);
    S = strrep(S, ',', '.');
    Value = sscanf(S, '%g', [1, nValue]);
    Result(iData,:, iBlock) = Value;
  end

  for iSep = 1:nSep
    fgetl(fid);
  end
end

fclose(fid);


Vielen Dank für deine Hilfe.
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.