matlab:分隔.csv文件,其中没有特定的分隔符可用

时间:2017-09-01 10:51:36

标签: matlab delimiter

我想知道是否有可能读取.csv文件,如下所示:

0,0530,0560,0730,.... 90,15090,15290,157....

我应该得到:

0,053 0,056 0,073 0,... 90,150 90,152 90,157 90,...

使用dlmread(path, '')时,matlab会发出错误说法 Mismatch between file and Format character vector. Trouble reading 'Numeric' field frin file (row 1, field number 2) ==> ,053 0,056 0,073 ...

我也尝试使用" 0,"作为分隔符,但matlab禁止这样做。

谢谢, jonnyx

3 个答案:

答案 0 :(得分:4)

str= importdata('file.csv','');   %importing the data as a cell array of char
for k=1:length(str)               %looping till the last line
    str{k}=myfunc(str{k});        %applying the required operation
end

,其中

function new=myfunc(str)
  old = str(1:regexp(str, ',', 'once'));  %finding the characters till the first comma
                                              %old is the pattern of the current line
  new=strrep(str,old,[' ',old]);  %adding a space before that pattern
  new=new(2:end);                 %removing the space at the start
end

file.csv

0,0530,0560,073
90,15090,15290,157

<强>输出:

>> str

str=

    '0,053 0,056 0,073'
    '90,150 90,152 90,157'

答案 1 :(得分:3)

您实际上可以使用textscan执行此操作,无需任何循环并使用一些基本的字符串操作函数:

fid = fopen('no_delim.csv', 'r');
C = textscan(fid, ['%[0123456789' 10 13 ']%[,]%3c'], 'EndOfLine', '');
fclose(fid);
C = strcat(C{:});
output = strtrim(strsplit(sprintf('%s ', C{:}), {'\n' '\r'})).';

使用示例输入文件输出:

output =

  2×1 cell array

    '0,053 0,056 0,073'
    '90,150 90,152 90,157'


工作原理......

format string指定从文件中重复读取的3个项目:

  • 包含0到9之间任意数量字符的字符串,换行符(ASCII代码10)或回车符(ASCII代码13)。
  • 逗号。
  • 三个人物。

每组3个项目为concatenated,然后所有集合均以空格分隔printed to a string。任何换行符或回车符的string is split都会返回以创建字符串的单元格数组,并且末尾的任何空格都为removed

答案 2 :(得分:2)

如果您可以访问GNU / * NIX命令行,我建议您在进入matlab之前使用sed 预处理您的数据。在这种情况下,命令是sed 's/,[0-9]\{3\}/& /g'

$ echo "90,15090,15290,157" | sed 's/,[0-9]\{3\}/& /g'

90,150 90,152 90,157

$ echo "0,0530,0560,0730,356" | sed 's/,[0-9]\{3\}/& /g'

0,053 0,056 0,073 0,356

另外,您可以轻松地将逗号,更改为小数点.

$ echo "0,053 0,056 0,073 0,356" | sed 's/,/./g'

0.053 0.056 0.073 0.356