matlab 如何读取具有不同列数的数据文件

j1dl9f46  于 2023-03-03  发布在  Matlab
关注(0)|答案(1)|浏览(375)

我正在读取数据文件(*.txt)。此数据文件的一行将包括19列(每一行用制表符或空格分隔)。然而,输出文件的特定结构将每一行数据“包裹”为只包括15列,接下来的4行进入新行。在一定数量的行之后,结构更改为6列。我添加以下屏幕截图(请注意,不是从共享的测试文件,但这是相同的结构)为方便解释,但所附的数据文件应该解释的事情进一步。

可以看到,第1~7556行有19列(一行15列,下一行4列,换行),第7557~ 7556行有6列,这两种结构在数据文件中重复,Here是样本测试文件的pastebin链接。
我尝试了下面的代码,但没有成功。

fid = fopen('test.txt');
C = cell2mat(textscan(fid, '%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f'));
fclose(fid);

我如何读取数据,并可能获得包含两种不同数据结构的两个单独的读数(或数据集)?

wh6knrhe

wh6knrhe1#

因为你有连续的分隔符,而且分隔符在一些行的开头,所以使用Matlab的csv/text读取函数不是很简单。但是阅读整个文件,然后根据缺失值的数量决定一行/一行属于哪个数据集,是有效的。请参见注解以获得解释。

% read csv, with consecutive delimiter join option
data = readmatrix('test.txt','Delimiter',' ','ConsecutiveDelimitersRule', 'join');

n_nans = sum(isnan(data),2); % identify number of nans per row

% get the row indices and identify for which dataset the rows are 
rows_set1_1 = n_nans == 1;  % one nan per full row for first dataset
rows_set1_2 = n_nans == 12; % 12 nans per row for the 'wrapped' lines
rows_set2 = n_nans == 10;

% divide data in two datasets
dataset1 = [data(rows_set1_1, :), data(rows_set1_2, :)]; % horizontal concatenate set 1 & 2
dataset2 = data(rows_set2, :);

% remove nan columns
dataset1(:,all(isnan(dataset1),1)) = []; 
dataset2(:,all(isnan(dataset2),1)) = [];

相关问题