1

我有一个由文本或数字组成的 csv 文件。但是有些列已损坏,如下图所示(“<<”KO)。当我通过 Matlab 打开 csv 文件(不导入)时,它将它们转换为数字并定义未定义的值,例如我想要的 "<<"KO 作为 NaN。但是当我通过脚本读取文件时,我写道:

opts = detectImportOptions(filedir);
table = readtable(filedir,opts);

它将它们读取为 char 数组。由于我有许多不同的 csv 文件(列不同),我想自动而不是使用 textscan(因为它需要文件格式,并且每个 csv 文件的文件格式不同)。有没有办法将包含数字文本的列的内容自动转换为数字?

数据

4

2 回答 2

0

假设您将数据存储在表中,您可以尝试使用 将字符数组的每一列转换为数值str2double。任何不转换为数值的值(空条目、单词、非数字字符串等)都将转换为NaN.

由于您想自动进行转换,我们必须做出一个关键假设:任何转换为​​所有 NaN值的列都应该保持不变。在这种情况下,数据可能是所有不可转换的字符数组,或者已经是数字。鉴于该假设,这种通用转换可以应用于任何表T

for varName = T.Properties.VariableNames
  numData = str2double(T.(varName{1}));
  if ~all(isnan(numData))
    T.(varName{1}) = numData;
  end
end

作为测试,以下示例数据:

T = table((1:5).', {'Y'; 'N'; 'Y'; 'Y'; 'N'}, {'pi'; ''; '1.4e5'; '1'; 'A'});

T = 

    Var1    Var2     Var3  
    ____    ____    _______

    1       'Y'     'pi'   
    2       'N'     ''     
    3       'Y'     '1.4e5'
    4       'Y'     '1'    
    5       'N'     'A'

会被上面的代码转换成如下:

T = 

    Var1    Var2     Var3 
    ____    ____    ______

    1       'Y'        NaN
    2       'N'        NaN
    3       'Y'     140000
    4       'Y'          1
    5       'N'        NaN
于 2017-11-11T04:36:06.333 回答
0

据我从您的评论中了解到,这就是您真正想要的:

for i = 1:numel(files)
    file = fullfile(folder,files(i).name));

    opts = detectImportOptions(file);
    idx = strcmp(opts.VariableNames,'Grade');

    if (any(idx))
        opts.VariableTypes(idx) = {'double'};
    end

    tabs(i) = readtable(file,opts);
end
于 2017-11-11T17:57:36.563 回答