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

Ascii basierte Textdatei einlesen und CellArry

 

retsam
Forum-Century

Forum-Century


Beiträge: 112
Anmeldedatum: 23.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2016, 16:52     Titel: Ascii basierte Textdatei einlesen und CellArry
  Antworten mit Zitat      
Hallo Zusammen,
und zwar sitzte ich gerade daran eine Datei einzulesen.
Ich habe schon versucht im Forum einen passenden EIntrag zu finden - jedoch habe ich die Lösung, welche dort vorgeschlagen wurden nicht adaptieren können.
Diese ist im Ascii Code.
Folgendes funktionier:
Code:
File = fopen('D:\Matlab\MeinProgramm\Dateien\15563');
   Name=textscan(File,'%s%s','delimiter','.');
   Rohdaten=Name{1};


Dabei habe ich das Problem, das die Datei als Cell Eingelesen wird.
Ich möchte nun ab Zeile x die Daten Extrahieren.
Diese sehen in der *.txt Datei wie folgt aus:
Code:
0,02     361,940277099609
 0,04     466,929260253906
 0,06     558,662658691406
 0,08     617,676025390625
 0,1     649,564025878906
 0,12     662,715637207031
 0,14     673,916931152344
 0,16     688,513916015625
 0,18     709,547058105469
 0,2     728,673156738281

Es sind immer zwei Messwerte.... ich bekomme es aber nicht hin diese zu trennen.
Jemand eine Idee?
Wäre sehr dankbar - da ich mir dann das umwandeln von Txt in Excel sparen kann.

Greetz
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: 05.03.2016, 17:21     Titel:
  Antworten mit Zitat      
Hallo,

das entscheidende Problem ist, dass als Dezimaltrennzeichen das Komma verwendet wird. Skripte zur Umwandlung von Komma in Punkt findest du hier, auf File Exchange oder per Google.
Dann '%f%f' als Format, und es sollte klappen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.03.2016, 17:32     Titel:
  Antworten mit Zitat      
Hallo,

warum nutzt du nicht einfach die Matlab ImportData Funktion? File auswählen, Optionen: Delimited anwählen (Column delimiters = space), Range A1:B10 und Numeric Matrix.

Dann erhälst du eine 10x2 double Matrix. Du kannst dir sogar den Importcode erzeugen lassen, um ihn als Funktion zum Einlesen weiterer Files zu verwenden.

Einfacher geht es doch nun wirklich nicht Wink

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
retsam
Themenstarter

Forum-Century

Forum-Century


Beiträge: 112
Anmeldedatum: 23.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2016, 17:34     Titel:
  Antworten mit Zitat      
Hallo Harald,
vielen Dank für die schnelle Antwort - bin ich ja nicht anders gewohnt!
So nun mal zum Code. Ich habe beizeiten folgende Funktionen mit verwendet (der Suche sei Dank). Der Code sieht nun wie folgt aus:
Code:
  Name=textscan(File,'%s%s','delimiter','.');
   Rohdaten=Name{1};
   [m,n] =size(Rohdaten);
   Rohdaten=Rohdaten(44:m);
   % Tausende Trenner entfernen
   regexprep(Rohdaten, '\.', '')
   % danach Komma durch Punkt ersetzen
   regexprep(Rohdaten, ',', '.');

Als Ausgabe erhalte ich folgende Daten:
Code:
'0,02     361,940277099609 '
    '0,04     466,929260253906 '
    '0,06     558,662658691406 '
    '0,08     617,676025390625 '
    '0,1     649,564025878906 '
    '0,12     662,715637207031 '
    '0,14     673,916931152344 '
    '0,16     688,513916015625 '

Nun möchte ich, wie du auch beschrieben hast mittels '%f%f' daraus eine Einfache Matrix bauen - leider funktioniert dies nicht denn ich bekomme immer folgende Fehlermeldung:
Error in ==> Fkt_DensoRead at 13
Rohdaten=textscan(Rohdaten,'%f%f');

Nun habe ich das gefühl, dass ich alles doppelt mache aus einem Cellarray in eine einen Cell dann umwandeln in Zahlen - wechseln von "," in "." und dann wieder umwandeln in Txt?

P.S. Die Quellen für den o.g. Code habe ich aus folgendem Beitrag:
http://www.gomatlab.de/ersetzen-von.....r-cell-arrays-t32660.html

Greetz und vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
retsam
Themenstarter

Forum-Century

Forum-Century


Beiträge: 112
Anmeldedatum: 23.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2016, 17:40     Titel:
  Antworten mit Zitat      
Hallo Harald,
vielen Dank für die schnelle Antwort - bin ich ja nicht anders gewohnt!
So nun mal zum Code. Ich habe beizeiten folgende Funktionen mit verwendet (der Suche sei Dank). Der Code sieht nun wie folgt aus:
Code:
  Name=textscan(File,'%s%s','delimiter','.');
   Rohdaten=Name{1};
   [m,n] =size(Rohdaten);
   Rohdaten=Rohdaten(44:m);
   % Tausende Trenner entfernen
   regexprep(Rohdaten, '\.', '')
   % danach Komma durch Punkt ersetzen
   regexprep(Rohdaten, ',', '.');

Als Ausgabe erhalte ich folgende Daten:
Code:
'0,02     361,940277099609 '
    '0,04     466,929260253906 '
    '0,06     558,662658691406 '
    '0,08     617,676025390625 '
    '0,1     649,564025878906 '
    '0,12     662,715637207031 '
    '0,14     673,916931152344 '
    '0,16     688,513916015625 '

Nun möchte ich, wie du auch beschrieben hast mittels '%f%f' daraus eine Einfache Matrix bauen - leider funktioniert dies nicht denn ich bekomme immer folgende Fehlermeldung:
Error in ==> Fkt_DensoRead at 13
Rohdaten=textscan(Rohdaten,'%f%f');

Nun habe ich das gefühl, dass ich alles doppelt mache aus einem Cellarray in eine einen Cell dann umwandeln in Zahlen - wechseln von "," in "." und dann wieder umwandeln in Txt?

P.S. Die Quellen für den o.g. Code habe ich aus folgendem Beitrag:
http://www.gomatlab.de/ersetzen-von.....r-cell-arrays-t32660.html

Greetz und vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.03.2016, 18:26     Titel:
  Antworten mit Zitat      
Siehe mein Post und ImportData.

Warum einfach wenns auch kompliziert geht...

Vermutlich meint Harald auch...

Code:
Name=textscan(File,'%f%f','delimiter','.');


und nicht noch ein zusätzliches textscan. Dann bleibt aber immer noch das Problem mit den Kommas statt Punkten. ImportData löst das Problem schon selbst.
Private Nachricht senden Benutzer-Profile anzeigen
 
retsam
Themenstarter

Forum-Century

Forum-Century


Beiträge: 112
Anmeldedatum: 23.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2016, 20:29     Titel:
  Antworten mit Zitat      
Guten Abend zusammen,
also erstmal vielen Dank für die Hilfe.
Mittels dem Import-Tool von Matlab konnte ich das Problem nicht lösen, da dies nicht das gewünschte Ergebnis brachte.
Jedoch konnte ich die Cellarrays in einem temporären *xlsx File speichern und wieder über XLSX read einlesen.
Der Code sieht nun wie folgt aus:

Code:

file = fopen('Pfad zu Datei','r');
Name=textscan(file,'%f%f','delimiter','.');
heading = textscan(file,'%s %s %s %s',1);
fgetl(file); % advance the file pointer one line
data = textscan(file,'%s %s', ' ');
fclose(file);
A = (data{1,1});
B = (data{1,2});
% Tausende Trenner entfernen
regexprep(A, '\.', '')
regexprep(B, '\.', '')
% danach Komma durch Punkt ersetzen
regexprep(A, ',', '.')
regexprep(B, ',', '.')
xlswrite('Pfad zu Datei',A);
xlswrite('Pfad zu Datei',B);
A = xlsread('Pfad zu Datei',1);
B = xlsread('Pfad zu Datei',1);

 


Mag eventuell etwas umständlich sein, jedoch klappt es bisweilen ganz gut... .

In diesem Sinne allen einen schönen Abend.

Greetz
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.03.2016, 20:50     Titel:
  Antworten mit Zitat      
Hallo,

evtl. habe ich ja missverstanden was für ein Ergebnis erwartet wird. Folgende Textzeile...

Code:
'0,02     361,940277099609 '


habe ich mit dem ImportData Tool eingelesen und zu 2 double Werten umgewandelt.

Code:
Textline1 = [0.02, 361.940277099609]


Ist das nicht wie gewollt?

Gruß DSP

P.S. Man hätte ja auch mal fragen können, warum das gewünschte Ergebnis nicht mit dem ImportData Tool erzielt werden konnte Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
retsam
Themenstarter

Forum-Century

Forum-Century


Beiträge: 112
Anmeldedatum: 23.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2016, 22:24     Titel:
  Antworten mit Zitat      
Guten Abend DSP,
vielen Dank für die Hilfe. Also die Importfunktion bringt bei mir folgendes Ergebnis:
Code:
0,02     361,940277099609 '
    ' 0,04     466,929260253906 '
    ' 0,06     558,662658691406 '
    ' 0,08     617,676025390625 '

Ich hätte gerne als Ergenis eine Matrix mit zwei Spalten.
1. Messpunkt
2. Wert

Das Problem ist einfach das ich es nicht umgewandelt bekomme.
Öffne ich jede Messdatei so kann ich diese in Excel speichern und dann einlesen.
Für alle Dateien wäre dies aber zu viel Arbeit, daher würde ich gerne einefach nur die Messertwerte direkt einlesen.

Greetz und Dank Retsam

PS. Die Textdatei ist Tabstopp getrennt.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.03.2016, 22:35     Titel:
  Antworten mit Zitat      
Hallo,

ich verwendet Matlab 2014b und habe mit nur wenigen Klicks das Ergebnis erhalten.
Für dein angegebenes Textbeispiel eine 10x2 double Matrix. Also genau so wie du es wünscht.

Nach der Auswahl des files (heißt bei mir Neues Textdokument.txt, deshalb auch der Variablenname) habe ich folgende Einstellungen gewählt (siehe Bild). Nun kann man die Daten einmalig durch Anklicken des grünen Häckchens importieren, oder sich eine Funktion erstellen lassen. Diese kann dann genutzt werden um files immer wieder nach dem selben Muster zu importieren ohne jedes mal das ImportData Tool verwenden zu müssen.

Gruß DSP

import_data.png
 Beschreibung:

Download
 Dateiname:  import_data.png
 Dateigröße:  66.64 KB
 Heruntergeladen:  284 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.03.2016, 22:54     Titel:
  Antworten mit Zitat      
retsam hat Folgendes geschrieben:
PS. Die Textdatei ist Tabstopp getrennt.


Bei dem hier gezeigten Textbeispiel sind vermutlich die Tabs bei copy&paste durch Leerzeichen ersetzt worden. Daher muss "Column delimiters" auf "Tab" stehen und nicht wie in dem Bild auf "Space". Das ändert die ImportData Funktion bei mir aber automatisch, nachdem ich die Leerzeichen durch Tabs in der Textdatei ersetzt habe. Ansonsten bleibt alles wie im Bild und das Ergebnis ist das gleiche.
Private Nachricht senden Benutzer-Profile anzeigen
 
retsa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2016, 22:56     Titel:
  Antworten mit Zitat      
Hallo,
das erklärt einiges. Ich arbeite mit 2009.
Nach dem Import bekomme ich Einen struct und Einen cellarray.
Daher vermutlich auch die Probleme.
Greetz Retsam
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.03.2016, 23:26     Titel:
  Antworten mit Zitat      
Dann teste doch mal folgendes Bsp.

Code:

file = fopen('Neues Textdokument.txt','r');
Name=textscan(file,'%f%f','delimiter','.');
heading = textscan(file,'%s %s %s %s',1);
fgetl(file); % advance the file pointer one line
data = textscan(file,'%s %s');
fclose(file);

% Komma durch Punkt ersetzen und string in zahl umwandeln
A = str2double(regexprep(data{1,1}, ',', '.'));
B = str2double(regexprep(data{1,2}, ',', '.'));
 
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: 06.03.2016, 23:58     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich arbeite mit 2009.

Ich kann nur dazu ermutigen, so etwas gleich zu sagen und am besten ins Profil einzutragen.

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

Forum-Century

Forum-Century


Beiträge: 112
Anmeldedatum: 23.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.03.2016, 19:12     Titel:
  Antworten mit Zitat      
Hallo Ihr beiden,
super vielen Dank. Den code konnte ich verwenden.


Greetz
Retsam
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.