Matlab:将单元格字符串(逗号分隔)转换为向量

时间:2012-10-15 14:40:04

标签: string matlab vector double type-conversion

我有一个巨大的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 ...

任何提示?最好没有任何循环,因为读取整个文件需要一段时间。

2 个答案:

答案 0 :(得分: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比写自己的子句更容易出错,对于空行,缺失值以及在大多数数据集中非常常见的其他很大的麻烦。

答案 1 :(得分:0)

尝试

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

它将完全按照您的意愿行事。

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

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

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