我有以下格式的文件:
**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);似乎不起作用。有人能告诉我怎么回事吗?我还需要知道如何‘不使用’分隔符,如果我想表达我的文件的确切写入方式,例如在上面的情况下,如何继续。
发布于 2015-02-05 17:34:28
编辑
一个可能的问题是formatspec变量的%s部分。因为%s是一个任意字符串,因此后继的76:0部分行被命令到该字符串。因此,对于formatspec‘'%d,%d::%d,%s,%d::%d’,您将从第一行中得到以下单元格:
400 100 400‘后裔,76:0’
要解决这个问题,有两种可能性:
formatspec = %d,%d::%d,descendsFrom,%d::%d\n或
formatspec = %d,%d::%d,%12s,%d::%d\n在第一种情况下,“descendForm”字符串必须包含在每一行中(如您的示例所示)。在第二种情况下,字符串可以更改,但其长度必须为12。
发布于 2015-02-05 16:41:06
您的分隔符是",“您应该首先对其进行分隔,然后可能运行正则表达式。下面是我要做的事情:
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发布于 2015-02-05 19:09:40
您可以在textscan中执行多个分隔符,它们需要作为字符串的单元格数组提供。您不需要格式的行结束字符,您需要设置'MultipleDelimsAsOne‘。不要使用MATLAB,但是一些类似的东西应该能起作用:
formatspec = '%d %d %*d %*s %d %*d';
data = textscan(fileID, formatspec,'Delimiter',{',',':'},'MultipleDelimsAsOne',1);如果要将其返回为数字矩阵而不是单元格数组,请尝试添加选项'CollectOutput',1。
https://stackoverflow.com/questions/28349030
复制相似问题