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

textscan für CSV-ähnliche Datei

 

Nicolas S.
Forum-Century

Forum-Century


Beiträge: 146
Anmeldedatum: 15.07.09
Wohnort: ---
Version: R2014a/b
     Beitrag Verfasst am: 15.05.2024, 08:46     Titel: textscan für CSV-ähnliche Datei
  Antworten mit Zitat      
Guten Morgen,

nach langer Matlab-Abstinenz versuche ich mich wieder darin, CSV-ähnliche Daten per Matlab einzulesen.

Die Daten sind in einer Textdatei, die als zwei CSV-Dateien hintereinander, getrennt durch eine Leerzeile, betrachtet werden kann.

Die erste Hälfte ist kurz und macht keine Probleme. Die zweite Hälfte ist ziemlich lang; die anhgehängte Dummy-Datei zum Texten ist stark gekürzt. Deswegen ist ein zeilenweises Einlesen mit fgetl() keine Option.

Die Datei endet immer auf eine Leerzeile.

Mein Ansatz:

Code:

% Test Dummy read
% Suche nach Einlesefehler textscan

clear all
close all

filename = './dummyFile.txt'


fid = fopen(filename);

% Dummy-Reads fuer Umgang mit File Header
fgetl(fid);
fgetl(fid);
fgetl(fid);


%% Eigentliches Problem

% Table Header Data
% Table Header is one single line of double-quote delimited strings
delimiter = ';'

line = fgetl(fid);
Rawdata.Header = strsplit(line, delimiter)
Rawdata.Header

% Format-Spec aus Tebellekopf basteln
TblFmt = cell(size(Rawdata.Header));
for i = 1:numel(TblFmt)
    if( strcmpi(Rawdata.Header{i}, '"Activity"') )
        % Textmarker Variante 1
        TblFmt{i} = '%s';

    elseif( strcmpi(Rawdata.Header{i}, '"Marker"') )
        % textmarker Variante 2
        TblFmt{i} = '%s';
       
    else
        TblFmt{i} = '%f';
    end
end
formatSpec = strjoin(TblFmt, delimiter)


nrows = -1;
r = 0;
c = 0;

Result  = textscan(fid, formatSpec, nrows, 'headerlines', r, 'headercolumns', c,...
    'returnonerror', false, 'emptyvalue', 0, 'CollectOutput', true)


fclose(fid);
 



Ich nutze den (zweiten) Tabellenkopf, um zwischen Text- und Zahlenspalten zu unterscheiden. Daraus bastele ich einen Formastring für textscan(). Letzteres scheint sich allerdings an leeren Text-Zellen zu verschlucken.

Ausgabe:
Code:

formatSpec =

%f;%s;%s;%f;%f;%f;%f

Error using textscan
Mismatch between file and format string.
Trouble reading literal string from file (row 1u, field 4u) ==> \n

Error in TestReadDummyFile (line 51)
Result  = textscan(fid, formatSpec, nrows, 'headerlines', r, 'headercolumns', c,...
 


Dass es wohl die leere Textspalte ist, entnehme ich der Tastsache, dass das Ergebnis bei 'returnonerror' = true so aussieht:

Code:

>> Result{:}

ans =

     0


ans =

    '"Activity";;-5.543526208;-31.56863234;-1.071612148;-1.182342353'    []


ans =

   Empty matrix: 0-by-4

>>
 



Hat jemand einen Tipp für mich?

Viele Grüße
Nicolas

TestReadDummyFile.m
 Beschreibung:

Download
 Dateiname:  TestReadDummyFile.m
 Dateigröße:  1.07 KB
 Heruntergeladen:  97 mal
DummyFile.txt
 Beschreibung:

Download
 Dateiname:  DummyFile.txt
 Dateigröße:  867 Bytes
 Heruntergeladen:  94 mal

_________________

--
The programmer suggested it.
Private Nachricht senden Benutzer-Profile anzeigen


Nicolas S.
Themenstarter

Forum-Century

Forum-Century


Beiträge: 146
Anmeldedatum: 15.07.09
Wohnort: ---
Version: R2014a/b
     Beitrag Verfasst am: 15.05.2024, 11:20     Titel:
  Antworten mit Zitat      
Um sicher zu gehen, dass zeilenweise einlesen wirklich inakzeptabel langsam ist, habe ich es ausprobiert. Leider lag ich richtig.

Code:

% Test Dummy read
% Suche nach Einlesefehler textscan

clear all
close all

file = './dummyFile.txt'
file = './VP01_mittelgrossedatei.csv'


fid = fopen(file);

% Dummy-Reads fuer Umgang mit File Header
fgetl(fid);
fgetl(fid);
fgetl(fid);


%% Eigentliches Problem

% Table Header Data
% Table Header is one single line of double-quote delimited strings
delimiter = ';'

line = fgetl(fid);
Rawdata.Header = strsplit(line, delimiter)
Rawdata.Header

% Format-Spec aus Tebellekopf basteln
TblFmt = cell(size(Rawdata.Header));
for i = 1:numel(TblFmt)
    if( strcmpi(Rawdata.Header{i}, '"Activity"') )
        % Textmarker Variante 1
        TblFmt{i} = '%s';

    elseif( strcmpi(Rawdata.Header{i}, '"Marker"') )
        % textmarker Variante 2
        TblFmt{i} = '%s';
       
    else
        TblFmt{i} = '%f';
    end
end
formatSpec = strjoin(TblFmt, delimiter)


nrows = -1;
r = 0;
c = 0;

if 0
    % Textscan verschluckt sich an leeren Textzellen
    Result  = textscan(fid, formatSpec, nrows, 'headerlines', r, 'headercolumns', c,...
        'returnonerror', true, 'emptyvalue', 0, 'CollectOutput', true)

    fclose(fid);
   
elseif 0
    % -> DLMread unterstuetzt keine Textzellen
   
     fclose(fid);

    % Read Table body data
    % dlmread starts with zero-index
    nLineHeader = 5;
    Rawdata.table = dlmread(file, delimiter , nLineHeader, 0);

elseif 1
    % Zeilenweise einlesen
    % extrem langsam selbst bei moderaten Dateigroessen (25 kB),
    % abgebrochen nach 5 Minuten
       
    tic
   
    % Tabellenzeilen (restliche Dateilaenge) zaehlen
    tblStart  = ftell(fid);
    nLines = 0;
    while ~feof(fid)
        line = fgetl(fid);
        nLines = nLines+1;
    end
    nLines;
    fseek(fid, tblStart, 'bof');
   
    % Eine Leerzeile am Ende
    nLines = nLines - 1;
   
    % Tabelle einlesen
    Result = cell(nLines, numel(TblFmt));
    for i = 1:nLines
        line = fgetl(fid);
        Ci = strsplit(line, delimiter, 'CollapseDelimiters', false);
        Result(i,:) = Ci;
    end
   
    fclose(fid);    
   
    toc
   
end
 

_________________

--
The programmer suggested it.
Private Nachricht senden Benutzer-Profile anzeigen
 
Nicolas S.
Themenstarter

Forum-Century

Forum-Century


Beiträge: 146
Anmeldedatum: 15.07.09
Wohnort: ---
Version: R2014a/b
     Beitrag Verfasst am: 15.05.2024, 11:35     Titel:
  Antworten mit Zitat      
Nachtrag: readtable() funktioniert und ist schnell genug.
_________________

--
The programmer suggested it.
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 - 2024 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.