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

Fehler bei read in Schleife- Iteration überspringen

 

Phipsi
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 11.08.16
Wohnort: München
Version: 2015b
     Beitrag Verfasst am: 26.10.2016, 11:41     Titel: Fehler bei read in Schleife- Iteration überspringen
  Antworten mit Zitat      
Hallo zusammen,

ich habe eine seeeehr große Datei (ca 1,5Gb) die ich mit der read-Funktion von Matlab einlesen. Die ersten 201 Iterationen funktionieren auch einwandfrei. Aber bei der 202ten bekomme ich den folgenden Fehler:
Error using matlab.io.datastore.TabularTextDatastore/read (line 107)
Mismatch between file and format string.
Trouble reading 'Numeric' field from file (row number 34670, field number 5) ==> -\n

Error in Einlesen_Leistungsdaten (line 23)
data1=read(ds);

Caused by:
Reading the variable name 'Var5' using format '%f' from file:
'C:\...\ganzerZeitraum.dat'
starting at offset 1078220371.

Da hier wohl ein Wert ein String statt einer Zahl ist, war meine Erste Lösung, das Einleseformat zu ändern und zuerst alles als Strings einzulesen und die Spalten danach wieder in floats umzuwandeln. Hier ist es deutlich einfacher einen Fehler aufzufangen. Dann bekomme ich aber wieder den einen Fehler und zwar den diesen:
Error using matlab.io.datastore.TabularTextDatastore/read (line 107)
The data in file:
'C:\...\ganzerZeitraum.dat'
does not appear to be tabular, with the same number of fields in each row and in each column. Verify the
Text Format and Advanced Text Format Properties.

Error in Fehlerbehubung (line 24)
data1=read(ds);


Anscheinend ist also die ganze Zeile Fehlerbehaftet. Leider ist es etwas schwierig in mehr als einer Millionen Zeile diese eine zu per Hand zu finden.

Meine Idee war jetzt, diese Iteration einfach zu überspringen und mit der nächsten weiterzumachen. Allerdings weiß ich nicht wie das mit Matlab funktioniert. Hat hier jemand einen Vorschlag, wie ich das programmieren kann?
Ich bin über jede Hilfe dankbar.

Edit: Ich habe jetzt ein try,catch Block eingebaut. Der fängt den Fehler zwar auf und ersetzt die Berechnungen durch dummy-Werte, aber jetzt habe ich das Problem, dass der immer wieder der gleiche Teil eingelesen wird. read funktioniert ja so, dass das Ende des aktuellen Blockes, der Anfang des nächsten wird. Aber da im Fehlerfall nicht eingelesen wird, probiert er es immer wieder im gleichen Block.
Wie kann ich read denn sagen, dass es weiterspringen soll?

Zuletzt bearbeitet von Phipsi am 26.10.2016, 12:16, insgesamt einmal bearbeitet
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: 26.10.2016, 12:14     Titel:
  Antworten mit Zitat      
Hallo,

in der Fehlermeldung steht ja, um welche Zeile es sich handelt: 34670.

Schau dir doch diese Zeile mal an und was da in der Spalte steht. Falls das ein ungültiger Eintrag ist, könnte 'TreatAsMissing' helfen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 11.08.16
Wohnort: München
Version: 2015b
     Beitrag Verfasst am: 26.10.2016, 12:20     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Hilfe. Die Zeile in der Fehlermeldung bezieht sich leider auf den aktuellen Block. Davor gibt es schon 201 Blöcke mit jeweils 42000 Zeilen. Also wird es etwas schwierig, diese eine Zeile in der Datei zu finden. Das habe ich auch schon probiert aber sobald ich die Datei im Editor öffne, wird mein Rechner sehr, sehr langsam, da mein Arbeitsspeicher an die Grenzen kommt.

TreatAsMissing schau ich mir mal an. Vielleicht hilft das weiter.

P.S. Ich habe noch ein Edit im ersten Post angefügt, wir haben wohl zeitgleich getippt Wink
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: 26.10.2016, 13:34     Titel:
  Antworten mit Zitat      
Hallo,

Wenn die Größe der verarbeiteten Blöcke immer gleich ist, dann dürfte es die Zeile 201*42000 + 34670 sein.
Mit fopen / for / fgetl sollte es möglich sein, an diese eine Zeile zu kommen.

Eine direkte Möglichkeit, Blöcke zu überspringen, sehe ich nicht. Da hilft wohl nur die Unterteilung in Partitionen (numpartitions / partition) und die Verarbeitung dieser Partitionen.

Grüße,
Harald
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: 26.10.2016, 14:46     Titel: Re: Fehler bei read in Schleife- Iteration überspringen
  Antworten mit Zitat      
Hallo Phipsi,

Mit VIM kann man auch in großen Textfiles ordentlich editieren. Bevorzuge die 64-Bit-Version.

Kannst Du den Debugger in der entsprechenden Zeile stoppen lassen und Dir die Zeile anzeigen lassen?
Code:


Ist das File-Format kompliziert? Wie wäre es die Daten Zeilenweise mit fscanf einzulesen? Das benötigt nur ein paar Zeilen Code, dafür hast du volle Kontrolle über die Fehlerbehandlung. Und wenn ein so großes Text-File Format-Fehler enthält, ist das ein grundsätzliches Problem. Die Frage ist, ob den Daten dann überhaupt zu trauen ist. Einfach mal eine Zeile wegzulassen ist ja eine mutige Herangehensweise.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 11.08.16
Wohnort: München
Version: 2015b
     Beitrag Verfasst am: 27.10.2016, 09:51     Titel:
  Antworten mit Zitat      
Guten Morgen ihr beiden,

der Tipp mit VIM hat mir sehr geholfen. Da ich damit in der Lage war die Datei mal vernünftig einzusehen, habe ich gemerkt, dass nach der fraglichen Zeile, die immer den Fehler auswirft, nur noch Mist kommt.
Da ist wohl das Messgerät ausgefallen oder sowas in der Art.

Nochmals vielen Dank euch beiden.

Gruß
Philipp
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.