how to read last few rows/lines from a text file ?

44 visualizzazioni (ultimi 30 giorni)
missy QIANHUI
missy QIANHUI il 27 Ott 2011
Risposto: Kristen Cognac il 20 Ott 2022
how to read last few rows/lines from a text file ? thanks

Risposte (4)

Bjorn Gustavsson
Bjorn Gustavsson il 27 Ott 2011
Modificato: Walter Roberson il 20 Giu 2016
If you can use something like this much is won:
[q,w] = system(['tail -n ',num2str(nr_of_lines_to_read),' ',filename]);
Then it can be as simple as this:
w = str2num(w);
...or more complicated depending on the contents of your file.
HTH.
  3 Commenti
K E
K E il 20 Giu 2016
tail command doesn't work on Windows machines. Cygwin may be a workaround.

Accedi per commentare.


Walter Roberson
Walter Roberson il 27 Ott 2011
Unless you can set a strict upper limit on the number of characters per line, the only way is to read a line at a time, remembering each new line and throwing away the oldest line (if you already have enough lines in the buffer.)
L = fgetl(fid);
if ~ischar(L); break; end %end of file
if length(LS) >= N %we have an extra line buffered
LS(1) = []; %so delete it
end
LS{end+1} = L; %and remember this new current last line
There are other ways of proceeding but they generally end up reading in the entire file first and then throwing away everything extra.
If you can put a strict limit on the number of characters per line, then there is a short-cut you can use: if the maximum line length is M and you want the last N lines, fseek() backwards (M+2)*N bytes from the end of the file and then start the above reading process. The +2 is to count carriage return and linefeeds.
I should specify that this shortcut of fseek() only works if your characters are single byte, no extended characters like greek or malaysian. If your file is UTF-8 or UTF-16 or UTF-32 encoded, then it is possible to make adjustments to the backwards seek count, but you could end up in the middle of an encoded character and you have to account for that.

Amardeep
Amardeep il 27 Ott 2011
You could used a fscan eof to get to the end of file then fgetl step up a line fgetl and repeat until you have enough lines from the end of the file.

Kristen Cognac
Kristen Cognac il 20 Ott 2022
Depends what operating system you're using. For Windows, I've had luck calling powershell and utilizing the Get-Content and Tail commands. Note, previously I was using fget1 and had to scan >10 million of text lines which took several minutes For this example, I've grabbed the last line of text with two lines of code and the same 10+ million line text file is read in 0.417 seconds. I'm sure you could condense it to one line as well...
Generic example:
temp_var=system('powershell -inputformat none cd YourFolderLocation');
[q,w] = system('powershell -inputformat none Get-Content *YourFileName* -Tail "#lines"');
Example with file names accessing last line and showing actual format:
temp_var=system('powershell -inputformat none cd C:\Users\XX\Downloads');
[q,w] = system('powershell -inputformat none Get-Content *Example.txt* -Tail "1"');

Categorie

Scopri di più su Labels and Annotations in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by