MatLab: Datei einlesen



  • Wie kann so etwas einfaches so schwer sein. :p

    Ich will einfach nur eine Datei mit Whitespaces und Delemiter einlesen. Ich versuche das mit textscan (textread ist deprecated).

    fileID = fopen(fname);
    file = textscan(fileID, '%c');
    fclose(fileID);
    

    Die Doku sagt bzgl. %c:

    Read any single character, including a delimiter

    Müsste also alles vollständig und einzeln lesen.
    Aber egal, ob ich %c oder %100c angebe, ich erhalte immer eine leere 1x1 Zelle. Mit %s wird hingegen alles außer die Delemiter gelesen.

    Jemand eine Idee?!

    L. G.,
    IBV


  • Mod

    Kann ich nicht nachvollziehen. Ist die Datei auch wirklich offen? Gib mal ein vollständiges Beispiel mitsamt Eingabedatei, was du tust, was passiert, was du erwartest. Dir ist schon klar, dass das Ergebnis (im Gegensatz zu '%s') trotzdem eine 1x1-Zelle ist, diese aber eben nicht leer ist? Siehe Beschreibung des Rückgabewerts im Falle einer "character conversion".



  • function [p, c] = read_txt(fname)
        fileID = fopen(fname);
        file = textscan(fileID, '%c');
        fclose(fileID);
        p = file;
        c = file;
        %[p,c] = hist(file, unique(file));
    end
    

    Aufruf per

    [a,b]=read_txt('midsummer.txt');
    

    Datei:
    http://www.gutenberg.org/cache/epub/1514/pg1514.txt

    In 1x1 passt doch nur ein Zeichen rein, oder? Ich erwarte die komplette Textdatei.

    L. G.,
    IBV


  • Mod

    IBV schrieb:

    function [p, c] = read_txt(fname)
        fileID = fopen(fname);
        file = textscan(fileID, '%c');
        fclose(fileID);
        p = file;
        c = file;
        %[p,c] = hist(file, unique(file));
    end
    

    Aufruf per

    [a,b]=read_txt('midsummer.txt');
    

    Datei:
    http://www.gutenberg.org/cache/epub/1514/pg1514.txt

    Und woran siehst du, dass es nicht geklappt hat? Bei mir funktioniert es bestens. Doch wohl nicht nur da dran, dass a und b 1x1-Zellen sind, oder? Du hast gesagt, dass sie leer wären. Das sollten sie aber nicht sein.

    In 1x1 passt doch nur ein Zeichen rein, oder? Ich erwarte die komplette Textdatei.

    1x1 von was? Eine Zelle kann doch jeden beliebigen Typen aufnehmen. Hier ist es ein 2D-char-Array, wobei eine der Dimensionen hier 1 ist (weil du immer 1 Zeichen einzeln liest) und die andere die Anzahl der Zeichen in der Datei (minus Anzahl der Whitespaces). Warum minus Anzahl der Whitespaces? Weil textscan immer führenden Whitespace ignoriert und das kann man ihm auch nicht austreiben. Wenn du lauter einzelne Zeichen liest, dann ist eben automatisch jeder Whitespace auch ein führender Whitespace für das darauf folgende Zeichen. Wenn du mehrere Zeichen lesen würdest (z.B. '%4c') könntest du zwar innerhalb dieser 4er-Blöcke Whitespace haben, aber Whitespace der zufällig am Anfang dieser Blöcke steht, wird trotzdem ignoriert.

    Letztlich ist textscan wohl die falsche Funktion, wenn du wirklich alles lesen willst. Du brauchst etwas low-leveligeres. file = fread(fileID, '*char'); oder ähnliches bietet sich an. Wenn du einen anderen Ausgabetyp wünscht: Musst du selber mal im Handbuch gucken. Ich habe nämlcih ehrlich gesagt MATLAB gerade eben das allererste Mal benutzt (ich mache nicht diese Art von Numerik), nur für diese Frage und mir alles anhand des Handbuchs, Google und Try&Error selber erschlossen. Wenn ich das in einer Viertelstunde schaffe, dann kannst du das auch.



  • Mit fread gings auf Anhieb, thx. 🙂
    Ich weiß auch nicht, weshalb es bei mir (scheinbar) nicht ging...

    L. G.,
    IBV


  • Mod

    IBV schrieb:

    Ich weiß auch nicht, weshalb es bei mir (scheinbar) nicht ging...

    Wie hast du denn ueberhaupt festgestellt, dass es nicht ging? Vielleicht liegt da ja der Fehler.



  • Doppelklick auf die Variable --> Doppelklick auf die Zelle --> Leere Zelle gesehen.
    Selbiges Vorgehen bei %s und hier sah ich die eingelesenen Wörter.

    L. G.,
    IBV


Log in to reply