我有一个巨大的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 ...
任何提示?最好没有任何循环,因为读取整个文件需要一段时间。
答案 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)
此代码将读取整个以逗号分隔的字符串并转换每个数字。