【问题标题】:Matlab textscan formatspec delimiter errorMatlab textscan formatspec分隔符错误
【发布时间】:2015-09-11 12:52:26
【问题描述】:

读取大型 csv 文件时,Matlab 无法识别 ||,||作为适当的分隔符作为 textscan 的输入参数。数据如下(简化):

||X||,||Y||,||Z|| (header)
||1||,||2||,||4||
||4||,||4||,||3||

等等

我使用data = textscan(fileID,formatSpec,'Delimiter',','); 读取具有某种格式规范'%f %f %f' 的数据。

我的橡皮筋解决方案是使用 010 编辑器替换所有 '||'使用 '',使其成为 matlab 的适当 csv 文件,但由于文档的大小(6M 行,大约 35 个字段)和新文档的频率,这几乎不是一个很好的解决方案。

有人知道导入此类文件的正确方法吗?

【问题讨论】:

  • 我想说找到一种方法将您的文件创建为逗号分隔文件,而不是饼图逗号管道分隔文件。话虽如此,您可能可以将两个管道作为字符串并将它们分开,即%s %f %s 作为格式规范。
  • 文件的创建不是由我来决定的,所以我不能让它成为一个真正的逗号分隔文件。

标签: matlab csv delimiter large-files textscan


【解决方案1】:

您应该能够将它包含在格式说明符中:

data = textscan(fid, '||%f||,||%f||,||%f||', 'headerlines', 1)

然后省略分隔符。

编辑(从 cmets 开始)

如果您尝试读取字符串,诀窍是让它读取没有| 字符的字符串。这是使用%[^|] 完成的,如下所示:

data = textscan(fid, '|| %[^|] ||,|| %[^|] ||,|| %[^|] ||', 'headerlines', 1)

【讨论】:

  • 现在不是将所有数字都放在一个单元格中吗?即textscan(fid,'||%f||', 'delimiter', ',')
  • 嗯,是的,如果您使用textscan(fid,'||%f||', 'delimiter', ','),您可以在一个单元格中获得所有内容。但是使用我所做的,我在三个单元格中得到了结果 - 只是检查了它。
  • 啊,我的意思是他可能希望他们都在一个牢房里?
  • 不,当然不是。我认为您的解决方案是这样做的,因为您没有指定分隔符。
  • 感谢您的回复!它可以完美地处理数字,但是当它尝试读取字符串时会出错。两个条目||CFF1368176799564369A951||,||2013-05-02|| 被读取为CFF1368176799564369A951||,||2013-05-02。在此 textscan 停止阅读后。有什么建议么?我试过在格式规范中弄乱 %[^|] 没有成功。