3

我有一个 csv 文件,其中包含 4 列的二维数组,但行数不同。例如:

2, 354, 23, 101
3, 1023, 43, 454
1, 5463, 45, 7657

4, 543, 543, 654
3, 56, 7654, 344

...

我需要能够导入数据,以便我可以对每个数据块运行操作,但是csvreaddlmreadtextscan都忽略空行。

我似乎无法在任何地方找到解决方案,这怎么办?

PS:

可能值得注意的是,上述格式的文件实际上是许多文件的串联,只包含一个数据块(我不想每次都从数千个文件中读取)因此块之间的空行可以是更改为任何其他分隔符/标记。这只是使用 python 脚本完成的。

编辑:我的解决方案 - 基于/受以下 petrichor 启发

我用速度更快的textscan替换了csvread。然后我意识到,如果我用 nan 行替换空白行(修改我的 python 脚本),我可以消除对第二个文本扫描慢点的需要。我的代码是:

filename = 'data.csv';
fid = fopen(filename);
allData = cell2mat(textscan(fid,'%f %f %f %f','delimiter',','));
fclose(fid);

nanLines = find(isnan(allData(:,1)))';

iEnd = (nanLines - (1:length(nanLines)));
iStart = [1 (nanLines(1:end-1) - (0:length(nanLines)-2))];
nRows = iEnd - iStart + 1;

allData(nanLines,:)=[];

data = mat2cell(allData, nRows);

计算时间为 0.28 秒(一个只有 103000 行的文件)。我已经接受了 petrichor 的解决方案,因为它确实最好地解决了我最初的问题。

4

1 回答 1

1
filename = 'data.txt';

%# Read all the data
allData = csvread(filename);

%# Compute the empty line indices
fid = fopen(filename);
lines = textscan(fid, '%s', 'Delimiter', '\n');
fclose(fid);
blankLines = find(cellfun('isempty', lines{1}))';

%# Find the indices to separate data into cells from the whole matrix
iEnd = [blankLines - (1:length(blankLines)) size(allData,1)];
iStart = [1 (blankLines - (0:length(blankLines)-1))];
nRows = iEnd - iStart + 1;

%# Put the data into cells
data = mat2cell(allData, nRows)

这为您的数据提供了以下信息:

data = 

    [3x4 double]
    [2x4 double]
于 2012-05-14T09:51:18.893 回答