Filter löschen
Filter löschen

How to import large text file data in to workspace?

4 Ansichten (letzte 30 Tage)
Abdurrehman
Abdurrehman am 4 Feb. 2017
Kommentiert: LeChat am 6 Jul. 2022
Hi, I am having a text file with following format
First Line is a string contains device parameters
rest is 18000x12 Lines format is double
I am using uigetfile to access my file then fscanf to read data. But this text file should reside in the same workscpace where the reading script is placed.
Is there any way to read above file without placing .txt file into current directory. The command importdata is not useful in my case only.

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 4 Feb. 2017
[filename, pathname] = uigetfile(.....)
fullname = fullfile(pathname, filename);
ncol = 12;
fmt = repmat('%f', 1, ncol);
fid = fopen(fullname, 'rt');
data_cell = textscan(fid, fmt, 'HeaderLines, 1, 'CollectOutput', 1);
fclose(fid);
data = data_cell{1};
  4 Kommentare
Walter Roberson
Walter Roberson am 5 Jul. 2022
datatime = [datatime; newline];
That is slow. Each time you append data to the end of an array, MATLAB has to allocate space for the new larger array, then copy the old values into the array, copy in the new value, then release the old space. The first time that would involve copying 0 existing rows; the second time it would involve copying 1 existing row; the third time, 2 existing rows, the 4th time, 3 existing rows, and so on. After N times that would be 0+1+2+3+...(N-1) existing rows copied, which would be (N-1)*N/2 rows copied from the beginning. It is an N^2 copying process.
Instead, if you can establish a maximum size, pre-allocate the memory, and assign into the array,
maxents = 50000;
datatime = zeros(maxents, 6);
...
datatime(counter,:) = newline;
Note: you are asking for the entire format of six %f64 items to be processed 6 times, so you are trying to read in 6 rows of 6 columns at a time. Are you sure that the data has a multiple of 6 rows in each block?
LeChat
LeChat am 6 Jul. 2022
Dear Walter, thank you very much for your answer.
Would you know how I can get the maximum row number to load in order to pre-allocated the memory and assign into the array? I am thinking of something similar to "wc -l filename" in shell, but here in Matlab, with -if possible- the possibility to get the respective size of each of the two blocks of data...
I actually don't remember why I was processing the data by sets of 6 rows... I know the number of columns in each block (the first block has 20 columns, the second one has 6 columns), but the number of rows is a priori unknown.
Thanks you very much for your help and interest.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Large Files and Big Data finden Sie in Help Center und File Exchange

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by