2016-03-29 6 views
1

Bezug zu this Frage zu lesen, habe ich diese Datenprobe in eine .txt-Datei gespeichert:Wie werden Daten mit einem benutzerdefinierten Begrenzer

'1458937887.70818 $GPGGA,200228.90,3555.3269,N,15552.9641,A*25' 
'1458937887.709668 $GPVTG,56.740,T,56.740,M, 
0.069,N,0.127,K,D*2D' 
'1458937887.712022 $GPGGA,200229.00,3555.3269,N, 
15552.9641,C*2B' 
'1458937887.714071 $GPVTG,286.847,T,286.847,M,0.028,N,0.051,K,D*28' 

ich die Daten folgendes lesen verwenden:

textscan(fileID,'%s','Delimiter','\n') 

Allerdings ist das \n nicht was ich will. Ich möchte ein anderes Trennzeichen als einen Buchstaben definieren (alphanumerisch), gefolgt von *, gefolgt von zwei Buchstaben (alphanumerisch), dann einem \n.

Bearbeiten: Das Hauptproblem besteht darin, dass einige Daten in zwei Zeilen gespeichert werden. Zum Beispiel gehören die Zeilen 2 und 3 oben zum selben Datenpaket.

Antwort

2

Ein Vorschlag, den ich habe, ist, die gesamte Datei als eine einzelne Zeichenfolge zu lesen. Dann können Sie die neuen Zeilen entfernen, die Sie selbst in der Datei abgelegt haben. Sobald Sie dies getan haben, verwenden Sie reguläre Ausdrücke, um neue Zeilenumbrüche einzufügen, nachdem Sie das gewünschte Muster gefunden haben, das ein alphanumerisches Zeichen ist, gefolgt von einem Sternchen * gefolgt von zwei alphanumerischen Zeichen. Sobald wir, dass endlich haben, verwenden Sie textscan mit der Delimiter Flagge durch die neuen Zeilenumbrüche die Saiten trennen wir gesetzt haben.

Erster Einsatz fread in Daten aus einer Datei zu lesen. Wir können diesen Befehl leicht missbrauchen, indem wir eine unendliche Anzahl von Zeichen lesen, was bedeutet, dass er die gesamte Datei bis zum Ende lesen wird. Wir müssen auch sicherstellen, dass wir angeben, dass jedes einzelne Element in dieser Datei ein Zeichen ist. Sobald wir das getan haben, suchen wir nach neuen Zeilen und entfernen sie. Unter Windows werden nicht nur Zeilenumbrüche eingeführt, sondern es werden auch Zeilenumbrüche eingeführt, aber der Code, den ich schreiben werde, ist unabhängig von dieser Tatsache. Wir müssen wissen, dass der Zeilenumbruch ASCII-Code 10 ist und der Wagenrücklauf ASCII-Code 13 ist. Die Ausgabe von fread wird tatsächlich ein double Array sein, wobei jedes Element der ASCII-Code eines Zeichens in der Datei ist. Wir werden logical Indizierung verwenden, um diese Elemente zu entfernen, dann regexprep verwenden, um nach dem gewünschten Muster zu suchen und neue Zeilenzeilenzeichen selbst einzufügen. Sobald wir dies tun, werfen wir es schließlich in textscan wie Sie es genannt haben.

Als solche:

fileID = fopen('...'); %// Place filename here 
str = fread(fileID, [1 inf], 'char'); %// Read in the string as one array 

%// Remove newlines and carriage returns (if applicable) 
str(str == 10 | str == 13) = []; 

%// Search for the desired pattern and insert newlines after the pattern 
out = regexprep(char(str), '\w\*\w{2}', '$0\n'); 

%// Finally split up the strings 
txt = textscan(out, '%s', 'Delimiter', '\n'); 
txt = txt{1}; 

%// Close the file 
fclose(fileID); 

Wenn wir regexprep verwenden, suchen wir nach einem alphanumerischen Zeichen \w, gefolgt von einem Stern \* (die \ hier wichtig ist, weil * in regex Sprache verwendet wird, etwas anderes zu bedeuten. Um das tatsächliche Zeichen * in Regex zu kennzeichnen, müssen Sie mit einem \ Zeichen vorangestellt werden, gefolgt von zwei alphanumerischen Zeichen \w{2}. Das Ergebnis sind diese Vorkommen in Ihrer Datei, die alle zusammen aus den Strings entfernt werden. Eine andere Kompliziertheit ist, dass wir müssen umgewandelt werden char, um die Zeichenfolge, die ursprünglich ein double Typ zu char zu konvertieren war. Auch die Ausgabe textscan in diesem Fall sollte Ihnen ein geschachteltes Zellenarray von einem Element geben, also entpacken wir die Zelle, indem wir auf die erste Zelle verweisen. Die gewünschte Ausgabe ist in txt.

+0

Das ist eigentlich nicht was ich will. Ich möchte diese Zeichen nicht entfernen. Vielleicht war ich nicht klar genug. Das Problem besteht darin, dass einige der Strings in zwei Zeilen gelesen werden, zum Beispiel die zweite und die dritte Zeile gehören zum selben Datenpaket.Deshalb möchte ich die Daten so lange lesen, bis ich diese Zeichen anstelle des '\ n's sehe. –

+0

Ahhh ich sehe. Nun, ein Vorschlag, den ich habe, ist, die gesamte Datei als String zu lesen, das gewünschte Muster durch die neue Zeile zu ersetzen und es dann durch textscan zu übergeben. Das ist die einzige Möglichkeit, wenn Sie Textscan verwenden möchten. Ich werde meine Antwort bald ändern. – rayryeng

+0

In der Tat habe ich keine Präferenz. Ich brauche nur meinen Code, um effizient zu laufen. –

Verwandte Themen