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

schwierige txt einlesen

 

bestmedia
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 72
Anmeldedatum: 02.04.11
Wohnort: Jena
Version: ---
     Beitrag Verfasst am: 06.03.2014, 15:05     Titel: schwierige txt einlesen
  Antworten mit Zitat      
Hallo,
ich versuche schon ewig verzweifelt eine txt-Datei einzulesen.
Die schwierigkeit besteht darin, dass die "Tabelle" nicht immer die gleiche Spaltenanzahl besitzt. Schwierig zu erklären...
im anhang ist sie mal beigefügt.
Die ersten zwei Spalten hätte ich gern als String und den Rest eben als Zahl. Bekomms aber leider nicht hin. Vielleicht kann mir einer helfen!
Getrennt sind alle Werte durch Tab

Danke!

config_mod.txt
 Beschreibung:

Download
 Dateiname:  config_mod.txt
 Dateigröße:  11.08 KB
 Heruntergeladen:  310 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: 06.03.2014, 15:43     Titel:
  Antworten mit Zitat      
Hallo,

die Blöcke sind immer gleich strukturiert, oder? Dann in etwa so:

Code:
fid = fopen('file.txt');
data = {};
while ~feof(fid)
newdata = % Einen Block einlesen mit textscan, vermutlich mit min. 2 textscan-Befehlen
% newdata an data anhängen
end
fclose(fid);


Grüße,
Harald

Zuletzt bearbeitet von Harald am 06.03.2014, 16:57, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
bestmedia
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 72
Anmeldedatum: 02.04.11
Wohnort: Jena
Version: ---
     Beitrag Verfasst am: 06.03.2014, 16:39     Titel:
  Antworten mit Zitat      
Hallo Harald,
die Blöcke sind vom Aufbau her identisch. Ich werde deinen Vorschlag versuchen umzusetzen.

Danke
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: 06.03.2014, 16:58     Titel:
  Antworten mit Zitat      
Hallo,

ich habe eine kleine Ergänzung eingefügt. Wenn's dabei Probleme gibt, kannst du dich ja rühren.

Bitte dann mit deinem bisherigen Ansatz.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 72
Anmeldedatum: 02.04.11
Wohnort: Jena
Version: ---
     Beitrag Verfasst am: 06.03.2014, 18:28     Titel:
  Antworten mit Zitat      
Hallo Harald,
ich bin nun soweit, dass ich alles einlesen kann, nur steht momentan jeder String in einer extra Zelle.
Code:
fid = fopen('config_mod.txt');
data = {};
while ~feof(fid)
newdata =textscan(fid,'%s','delimiter','\t');    % Einen Block einlesen mit textscan, vermutlich mit min. 2 textscan-Befehlen
end
fclose(fid);

b = ~cellfun('isempty', newdata{1}); % Alle leeren Zellen indizieren
c=newdata{1}(b); % Alle leeren Zellen löschen
% Ein "Block" erstreckt sich nun über 78 Zellen

Jetzt würde ich anfangen zu Sortieren. Aber ich glaube das ist etwas "russisch" und es geht auch eleganter...

Du meintest, dass ich mehrere textscan befehle verschachteln soll?
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: 07.03.2014, 11:18     Titel:
  Antworten mit Zitat      
Hallo,

ich dachte an etwas folgender Art:

Code:
fid = fopen('config_mod.txt');
data = {};
headers = {};
headers2 = {};
while ~feof(fid)
    headers{end+1} = fgetl(fid); % noch verschönern
    headers2{end+1} = fgetl(fid); % noch verschönern
    data{end+1} = cell2mat(textscan(fid,['%*s %*s ' repmat('%f ', 1, 17) '%*[^\n]'], 4, 'delimiter','\t'));    
end
fclose(fid);


Muss man sicher noch dran arbeiten.
Ein Problem ist übrigens, dass der dritte Block nur eine Kopfzeile hat, während die anderen zwei Kopfzeilen haben.

Wichtig ist auch, dass man sich nur die Informationen aus der Datei holen sollte, die man braucht, und alles andere mit * überspringt. Die Informationen, die man braucht, sollte man dann so organisieren, dass man anschließend gut damit arbeiten kann (was natürlich wiederum davon abhängt, was du mit den Daten dann machen willst).

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 72
Anmeldedatum: 02.04.11
Wohnort: Jena
Version: ---
     Beitrag Verfasst am: 07.03.2014, 11:52     Titel:
  Antworten mit Zitat      
Hallo Harald,
erstmal vielen lieben Dank für deine Mühe!
Ich werde deine Version gleich mal versuchen umzusetzen. Das mit dem 3. Block war ein Fehler. Die Zeile fehlte.

Hier erstmal mein Code, der zwar funktioniert aber wahrscheinlich nicht der schöneste ist Smile

Code:
fid = fopen(ConfigDatei);
while ~feof(fid)
newdata = textscan(fid,'%s', 'delimiter', '\t', ...
                   'commentStyle', '%');
end
fclose(fid);
b = ~cellfun('isempty', newdata{1}); % Alle leeren Zellen indizieren
c=newdata{1}(b); %Alle leeren Zellen löschen
%Ein Block ist 78 Zellen
d={1:Spalten};
for i=1:Spalten
d{i}=cell(6,18);
d{i}(1,1:3)=c(1:3); c(1:3)=[]; % 1.. Spalte
d{i}(2,1:3)=c(1:3); c(1:3)=[]; % 2. Spalte
d{i}(3,1:Spalten)=c(1:Spalten);c(1:Spalten)=[]; % 3.Spalte
d{i}(4,:)=c(1:Spalten);c(1:Spalten)=[];
d{i}(5,:)=c(1:Spalten);c(1:Spalten)=[];
d{i}(6,:)=c(1:Spalten);c(1:Spalten)=[];
end
Private Nachricht senden Benutzer-Profile anzeigen
 
josye
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2014, 11:45     Titel:
  Antworten mit Zitat      
Hallo zusammen

Ich bin ziemlich neu, was Matlab-Programmierung angeht, und habe schon den gestrigen Tag mit suchen verbracht.

Nun ist dieser Thread, glaube ich, am passendsten.

Ich bekomme vom Messgerät eine*.asc Datei ausgegeben. Die Datei hat 35 Spalten und 600 Zeilen. jedoch sollen die ersten 2 Spalten Wegfallen(Datum,Uhrzeit).

Problem dabei, dass die Tabelle nicht vollständig gefüllt ist.

Wie kann man die tabelle einlesen, so dass die nicht vollständig ausgefüllten zeilen wegfallen, die Headerdateien aber bleiben. Und aus jeder spalte ein Spaltenvektor entsteht.

Vielen Dank für die Hilfe im Voraus. Im Anhang ist der Anfang meiner Datei

Messung 1 test.txt
 Beschreibung:

Download
 Dateiname:  Messung 1 test.txt
 Dateigröße:  3.04 KB
 Heruntergeladen:  288 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
josye
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.03.2014, 10:13     Titel: Einlesen geschafft, komma durch POunkt ersetzen misslingt
  Antworten mit Zitat      
Moin moin

Habe meine *.asc Datei in eine txt gewandelt und mit einem editor die Kommas durch Punkte ersetzt.
Mit diesem Code

Code:
M = dlmread('Messung_1_test.txt', '\t', 15, 2)
 

konnte ich die Datei einlesen und eine Matrix erstellen.

Jedoch habe ich das Problem, dass ich nicht immer händisch die Kommas ersetzen will. Und die Funktion (gefunden im Forum)
Code:
function comma2point(File)
% Generate a new file named Oldfilename_Modified.ending. In the new File all
% ',' are changed to '.' Needs a full datapath and filename as input.
   
    Name=textscan(File,'%s%s','delimiter','.');
    NewFile=strcat(Name{1}, '_Modified.',Name{2});
    copyfile(File, NewFile{1});
    file    = memmapfile(NewFile{1},'Writable',true);
    comma   = uint8(',');
    point   = uint8('.');
    file.Data(( file.Data==comma)' ) = point;
    delete(file)
end

funktioniert bei mir nicht. Bzw muss ich in dem Code noch etwas ändern?
Der Fehler lautet
Zitat:
comma2point(Messung_1.txt)
Undefined variable "Messung_1_test" or function "Messung_1_test".
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDread
Forum-Century

Forum-Century


Beiträge: 212
Anmeldedatum: 11.05.11
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 27.03.2014, 10:20     Titel:
  Antworten mit Zitat      
Hallo josye,
das Script comma2point funktioniert schon Wink ich benutze es auch ab und an.
Hast du die Hochkommas gesetzt?

Code:
comma2point('Messung_1.txt')


Wenn ja versuch es mal mit dem absoluten Pfad
Code:
comma2point('C:\...\Messung_1.txt')


Grüße
Chris
_________________

--> Kapieren statt Kopieren <---
____________________________________________________
FAQs sind dazu da, FAQs zu beantworten Wink
Richtig fragen!

Zuletzt bearbeitet von BlackDread am 27.03.2014, 10:21, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
bestmedia
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 72
Anmeldedatum: 02.04.11
Wohnort: Jena
Version: ---
     Beitrag Verfasst am: 27.03.2014, 10:20     Titel:
  Antworten mit Zitat      
Hallo,
richtig heisst es:
Code:
comma2point('Messung_1.txt')


Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
josye
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.03.2014, 11:35     Titel:
  Antworten mit Zitat      
Hochkommas vergessen,mist

Aber trotzdem:

Der Fehler sieht nun so aus.


Code:
>> comma2point('Messung_1_test.txt')
Error using copyfile
No matching files were found.

Error in comma2point (line 7)
    copyfile(File, NewFile{1});
 


Egal ob absoluter Pfad oder nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDread
Forum-Century

Forum-Century


Beiträge: 212
Anmeldedatum: 11.05.11
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 27.03.2014, 12:06     Titel:
  Antworten mit Zitat      
Hallo josye,

also bei mir funktioniert das Script.

Code:
comma2point('C:\Users\...\Desktop\Messung_1_test.txt')


Bei deinem Aufruf/Fehler würde ich davon ausgehen, dass du bei Aufruf der Funktion den Pfad wechselst und Matlab die Datei nicht mehr sieht.
Aber wenn es mit absolutem Pfad auch auftritt, bin ich nahezu ratlos.
Hast du mal einen Breakpoint bei copyfile gemacht und dir angeschaut, was in File drinsteht und ob die Datei wirklich so existiert, wie in der Variable steht?

Grüße
Chris
_________________

--> Kapieren statt Kopieren <---
____________________________________________________
FAQs sind dazu da, FAQs zu beantworten Wink
Richtig fragen!
Private Nachricht senden Benutzer-Profile anzeigen
 
bestmedia
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 72
Anmeldedatum: 02.04.11
Wohnort: Jena
Version: ---
     Beitrag Verfasst am: 27.03.2014, 12:24     Titel:
  Antworten mit Zitat      
Wenn es sich um einen Rechner auf Arbeit handelt und die Datei evtl. im Netzwerk liegt, hast vielleicht keine Schreibrechte, da eine copy Befehl ausgeführt wird...
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.