0

我有一个巨大的 csv 文件(如:不止几场演出),想在 Matlab 中读取它并处理每个文件。完整读取文件是不可能的,因此我使用此代码读取每一行:

fileName = 'input.txt';
inputfile = fopen(fileName);

while 1
    tline = fgetl(inputfile);
    if ~ischar(tline)
        break
    end
end
fclose(inputfile); 

这会产生一个大小为 (1,1) 的单元格数组,其中行作为字符串。我想要的是将此单元格转换为仅包含数字的普通数组。例如:

input.csv:
0.0,0.0,3.201,0.192
2.0,3.56,0.0,1.192
0.223,0.13,3.201,4.018

第一行在 Matlab 中的最终结果:

A = [0.0,0.0,3.201,0.192]

我尝试使用 double(tline) 转换 tline,但这会产生完全不同的结果。也尝试使用正则表达式,但卡在那里。我到了将所有值拆分到一个数组中的不同单元格中的地步。但是使用 str2double 转换为 double 只会产生 NaN ......

有小费吗?最好没有任何循环,因为读取整个文件已经需要一段时间了。

4

2 回答 2

3

你正在寻找str2num

>> A = '0.0,0.0,3.201,0.192';
>> str2num(A)
ans =
     0  0  3.2010  0.1920
>> A = '0.0 0.0 3.201 0.192';
>> str2num(A)
ans =
     0  0  3.2010  0.1920
>> A = '0.0     0.0 ,    3.201 , 0.192';
>> str2num(A)
ans =
     0  0  3.2010  0.1920

例如,输入格式是完全不可知的。

但是,对于您的用例,我不会建议这样做。对于你的问题,我会做

C = dlmread('input.txt',',', [1 1 1 inf]) % for first line
C = dlmread('input.txt',',')              % for entire file

或者

[a,b,c,d] = textread('input.txt','%f,%f,%f,%f',1) % for first line
[a,b,c,d] = textread('input.txt','%f,%f,%f,%f')   % for entire file

如果您想要单独变量中的所有列:

a = 0
b = 0
c = 3.201
d = 0.192

或者

fid = fopen('input.txt','r');
C = textscan(fid, '%f %f %f %f', 1); % for first line only
C = textscan(fid, '%f %f %f %f', N); % for first N lines
C = textscan(fid, '%f %f %f %f', 1, 'headerlines', N-1); % for Nth line only
fclose(fid);

所有这些都更容易扩展(像这样的东西,不管它们是什么,随着时间的推移会变得更大:)。特别dlmread是比编写自己的子句更不容易出错,因为空行、缺失值和其他在大多数数据集中非常常见的大麻烦。

于 2012-10-15T17:41:25.467 回答
0

尝试

data = dlmread('input.txt',',')

它会做你想做的事。

如果您仍想将字符串转换为向量:

line_data = sscanf(line,'%g,',inf)

此代码将读取整个逗号分隔的字符串并转换每个数字。

于 2012-10-15T17:17:47.427 回答