首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Textscan;不读取格式

Textscan;不读取格式
EN

Stack Overflow用户
提问于 2015-02-05 16:24:51
回答 3查看 206关注 0票数 0

我有以下格式的文件:

代码语言:javascript
复制
**400**,**100**::400,descendsFrom,**76**::0
**400**,**119**::400,descendsFrom,**35**::0
**400**,**4**::400,descendsFrom,**45**::0
...
...

现在我需要读一读,部分只有在大胆。我编写了以下格式规范:

代码语言:javascript
复制
formatspec = '%d,%d::%*d,%*s,%d::%*d\n';
data = textscan(fileID, formatspec);

似乎不起作用。有人能告诉我怎么回事吗?我还需要知道如何‘不使用’分隔符,如果我想表达我的文件的确切写入方式,例如在上面的情况下,如何继续。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-05 17:34:28

编辑

一个可能的问题是formatspec变量的%s部分。因为%s是一个任意字符串,因此后继的76:0部分行被命令到该字符串。因此,对于formatspec‘'%d,%d::%d,%s,%d::%d’,您将从第一行中得到以下单元格:

400 100 400‘后裔,76:0’

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

代码语言:javascript
复制
formatspec = %d,%d::%d,descendsFrom,%d::%d\n

代码语言:javascript
复制
formatspec = %d,%d::%d,%12s,%d::%d\n

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

票数 0
EN

Stack Overflow用户

发布于 2015-02-05 16:41:06

您的分隔符是",“您应该首先对其进行分隔,然后可能运行正则表达式。下面是我要做的事情:

代码语言:javascript
复制
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,这将生成:

代码语言:javascript
复制
 test = '**400**,**4**::400,descendsFrom,**45**::0'
 test = regexprep(test,{'*',':'},{'',''})

 >> test = 400,4400,descendsFrom,450
票数 0
EN

Stack Overflow用户

发布于 2015-02-05 19:09:40

您可以在textscan中执行多个分隔符,它们需要作为字符串的单元格数组提供。您不需要格式的行结束字符,您需要设置'MultipleDelimsAsOne‘。不要使用MATLAB,但是一些类似的东西应该能起作用:

代码语言:javascript
复制
formatspec = '%d %d %*d %*s %d %*d';
data = textscan(fileID, formatspec,'Delimiter',{',',':'},'MultipleDelimsAsOne',1);

如果要将其返回为数字矩阵而不是单元格数组,请尝试添加选项'CollectOutput',1

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28349030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档