文本扫描软件;不读格式

Textscan Matlab ; Doesn't read the format

我有一个格式如下的文件:

**400**,**100**::400,descendsFrom,**76**::0
**400**,**119**::400,descendsFrom,**35**::0
**400**,**4**::400,descendsFrom,**45**::0
...
...

现在我需要阅读,只有粗体部分。我写了以下格式规范:

formatspec = '%d,%d::%*d,%*s,%d::%*d\n';
data = textscan(fileID, formatspec);

好像不行。有人能告诉我怎么了吗? 我还需要知道如何使用 'not use' 定界符,以及如果我想表达我的文件的确切写入方式,例如在上述情况下如何继续。

您的定界符是“,”,您应该首先将其定界,然后 运行 一个正则表达式。以下是我的处理方式:

fileID = fopen('file.csv');
D = textscan(fileID,'%s %s %s %s ','Delimiter',','); %read everything as strings

column1 = regexprep(D{1},'*','')
column2 = regexprep(D{2},{'*',':'},{'',''})
column3 = D{3}
column4 = regexprep(D{4},{'*',':'},{'',''})

这应该会生成您的 4 列,然后您可以将它们组合起来 我相信分隔符只能是一个符号。更有效的方法是直接对整行执行 regexprep,这将生成:

 test = '**400**,**4**::400,descendsFrom,**45**::0'
 test = regexprep(test,{'*',':'},{'',''})

 >> test = 400,4400,descendsFrom,450

已编辑

格式规范变量的 %s 部分可能存在问题。因为 %s 是一个任意字符串,所以该行的 descendsFrom,76::0 部分被排序到这个字符串。因此,使用 formatspec '%d,%d::%d,%s,%d::%d\n' 您将从第一行获得以下单元格:

400 100 400 'descendsFrom,76::0'

解决这个问题有两种可能:

formatspec = %d,%d::%d,descendsFrom,%d::%d\n

formatspec = %d,%d::%d,%12s,%d::%d\n

在第一种情况下,'descendForm' 字符串必须包含在每一行中(如您的示例所示)。在第二种情况下,字符串可以更改,但其长度必须为 12。

您可以在 textscan 中使用多个分隔符,它们需要作为字符串元胞数组提供。格式中不需要行尾字符,需要设置'MultipleDelimsAsOne'。手头没有 MATLAB,但按照这些思路应该可以工作:

formatspec = '%d %d %*d %*s %d %*d';
data = textscan(fileID, formatspec,'Delimiter',{',',':'},'MultipleDelimsAsOne',1);

如果您想 return 它作为数字矩阵而不是元胞数组,请尝试同时添加选项 'CollectOutput',1