【问题标题】:Removing unrelevant spaces from a csv file with Matlab使用 Matlab 从 csv 文件中删除不相关的空格
【发布时间】:2015-11-02 03:32:00
【问题描述】:

我正在尝试使用 Matlab 导入一个 csv 文件,其中包含标题行和几列。开头是这样的:

Essai : Taux 1;"1,00000";mm/min
Déformation : Déformation de traction (Déplacement) longueur initiale;"100,00000";mm
Généralités : Date de début;"09/07/2015 17:12"
Généralités : Date de fin;"09/07/2015 17:15"

Temps;Charge;Déplacement traverse
(s);(N);(mm)
"0,00000";"-0,22448";"0,00000"
"0,10000";"2,56269";"0,00093"
"0,20000";"3,84100";"0,00328"
"0,30000";"3,84073";"0,00524"
"0,40000";"4,06938";"0,00648"
...

我可以使用 xlsread 导入它,手动删除标题:

A = xlsread('filename.csv');
B = A(n_headerlines+1:end,:);

而且效果很好。但是,当我达到数千时,我的数据中有不相关的空格:

...
"147,70000";"984,81097";"2,46197"
"147,80000";"998,60400";"2,46318"
"147,89999";"1 020,65094";"2,46489"
"148,00000";"1 043,27832";"2,46694"
...

在导入数据后在 A 或 B 中给出 NaN。

如何在保留 csv 格式的同时删除这些空格? 我正在考虑使用 strrep,但如果不破坏 csv 文件的格式,我无法弄清楚如何使用。

感谢您的帮助!

【问题讨论】:

  • 您确定空格来自 xlsread 而不是来自原始 csv 文件?此外,我不明白您为什么害怕使用 strrep 删除空格,因为您遇到的每个空格似乎都是一个问题。
  • @zounnouf,看来你有两个选择。您应该在使用 xlsread 之前删除 csv 文件中的空格,或者使用分隔符“;”逐行读取 csv 文件作为字符串并从每个字符串中删除空格并填充矩阵
  • 如果A 中的NaNs 困扰着您,您可以在致电xlsread 后使用A(isnan(A))=[]; 摆脱它们。

标签: matlab csv data-import


【解决方案1】:

尝试使用 [~,~,A]=xlsread(...) 而不是 A=xlsread(...)

后一个调用只返回数值,任何不能正确转换的都返回 NaN。由于您在所有值中都有超过一千个的空格,因此您会在仅 num 的输出中看到 NaN。

前一个调用将在一个单元格中包含数字数据和文本数据。您可以对文本字符串进行操作以删除空格,然后转换为数字(使用 cellfun)。之后,您可以将整个单元格转换为数值数组(使用 cell2mat)。

作为最佳实践,我建议在 csv 文件上使用 delimread 而不是 xlsread。您仍然需要删除空格。

【讨论】:

    【解决方案2】:

    感谢您的帮助

    根据 Kirby Fears 的提示,我可以将数据导入单元格,将格式错误的值导入字符串而不是 NaN,然后​​使用 strrep。

    不知何故,我无法立即替换字符串中的空格(可能我作用于 1x1 单元格而不是字符串)。 最后,以下工作:

    [a,b,c]=xlsread('filename.csv');
    idx_NaN = find(isnan(a)); % A way to track all indexes corresponding to wrong-formatted data. Watch out : linear indexes !
    a_without_NaN = a;
    for i = 1:size(idx_NaN,1)
        [i_NaN, j_NaN] = ind2sub(size(a),idx_NaN(i));
        char_NaN = c{i_NaN, j_NaN};
        if ~isnan(char_NaN)
            char_NaN = strrep(char_NaN,',','.');
            char_NaN = char_NaN(~isspace(char_NaN));
            a_without_NaN(i_NaN,j_NaN) = str2double(char_NaN);
        end
    end
    

    a_without_NaN 包含导入的数据,格式令人满意。

    【讨论】:

      猜你喜欢
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 2015-03-12
      • 2013-01-30
      相关资源
      最近更新 更多