2014-04-12 40 views
0

我有一个包含许多.csv文件的文件夹。在每个.csv文件的第一行中,有49个参数名称,在所有其他行中,这些参数有49个值。我需要读取每个文件并分离参数及其相应的值。如果一个值为空,我需要输入一个NaN,然后是零而不是那个。我写的代码适用于除第二列(第二个参数)之外的所有参数,其值是日期和时间,我的代码将NaN用于此参数的所有值。在Matlab中导入和解析.csv文件

这里是我的代码:

for h = 1:numel(CSVfiles) % h is number of CSV files in the coresponding folder 

    delimiter = '\t'; 
    formatSpec = '%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%[^\n\r]'; 

    fileID = fopen(CSVfiles(h,1).name,'r'); 
    dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'ReturnOnError', false); 
    fclose(fileID); 

    for i=1:49 
     C(1,i)= dataArray(1,i); 
    end 

    C =cellfun(@str2double,C,'un',0); 

    VarName1 = cell2mat(C(:,1));  % for this column it works fine 
    VarName1(isnan(VarName1)) = 0 ; 
    VarName2 = cell2mat(C(:,2));  % for this column it replaces all values with zero! 
    VarName2(isnan(VarName2)) = 0 ; 

    end 
+0

您的代码行'C = cellfun(@ str2double,C,'un',0);'试图将每个读取的字符串转换为双精度数字。尝试转换日期字符串时失败。您可以使用该列的函数'datenum'。在使用textscan时,您也可以在'formatSpec'中使用'%f',这样您就可以直接读取数字。如果您不包含正在阅读的csv行示例,则无法给出正确的示例代码。 – Hoki

回答

0

当我明白你的问题,列二是日期和时间,而其它的是标量数值,对不对?

该问题可能是由于尝试使用str2double来分析日期/时间字符串所致。尝试在该列上使用datenum(您需要指定日期/时间格式类型,请参阅datenum的文档)。