2012-10-15 209 views
0

我有一个巨大的csv文件(如:超过几个演出),并希望在Matlab中读取它并处理每个文件。读取其全部文件是不可能的,所以我使用此代码中的每一行改为:Matlab:将单元格字符串(逗号分隔)转换为矢量

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

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

这yiels尺寸(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] 

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

任何提示?最好没有任何循环,因为它已经花费一些时间来读取整个文件。

+1

您是否试过为CSV读取指定'row','col'和'range'参数? – slayton

+0

好点,我会试试。 – Tim

+0

使用'str2num(tline)'而不是'str2double'。 –

回答

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); 

所有这一切更容易扩展(比如th不管他们是什么,随着时间的推移会变得越来越大:)。尤其是dlmread比写自己的子句更容易出错,对于空行,缺失值和其他大多数数据集中常见的大麻烦。

+0

这似乎是我的问题的完美答案,但是,我无法使'inf'参数工作......它给出了一个错误: 非有限端点或增量为冒号操作符在索引 – Tim

+0

@Tim:woops,似乎我没有足够彻底的测试。我现在没有机会,但是你可以试试'C = dlmread('input.txt',',',1)'? (即没有向量),或'C = dlmread('input.txt',',',1:10)'(对于前10行,希望:) –

+0

我试过但两者都不起作用。我通过手动指定列范围来修复它,因为我从另一个矩阵中知道这一点(尽管这当然不是很模块化)。 此外,我可以通过尝试捕捉每一行来捕捉文件的结尾(因为我不知道行范围)可以通过文件读取。 – Tim

0

尝试

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

它会做你想要做什么。

如果你仍然想字符串转换成矢量:

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

此代码将读取整个昏迷分隔串并转换每个号码。

相关问题