文本扫描软件;不读格式
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
我有一个格式如下的文件:
**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