一行一行导入ASCII制表符分隔的值

时间:2019-04-22 17:53:20

标签: matlab tab-delimited

Matlab无法正确分割由制表符分隔的,单词之间有空格的行。我该如何工作?

例如,假设我有一个要提取这两行的文件,第一行是标题行,第二行是一行数据:

#DATA_NAME    field1    field2    field3
DATA_NAME    14    A String    34.1

(定界符是制表符,但我在此处显示了多个空格)

我编写了一个自定义解析器,该解析器应生成具有以下内容的表:

field1       field2      field3
______       ______      ______
  14        A String      34.1

我看到的是这样的:

field1       field2     field3
______       ______     ______
  14           A        String

我有一个使用split()函数和fgetl逐行的解决方案,如果条目中没有空格,则该方法有效。正在执行:

splitted = split(line, '\t')

似乎无效。我做了一些检查,但分隔符没有=='\ t'...

(我必须使用我的自定义解析器,因为一个文件中有许多不同类型的数据,每种数据具有不同的列数和不同的标题。)

3 个答案:

答案 0 :(得分:1)

与此here类似的问题。您可以尝试:

C = textscan(fopen(filename),'%s %d %s %d');

此行将产生具有所有值的单元格C。查阅Matlab的textscan文档。

答案 1 :(得分:1)

使用char(09)代替'\t'

我无法精确列出它们,但我注意到某些Matlab字符串解析器将'\t'识别为正确的 TAB 字符,但其他一些字符则无法识别并将其视为2个独立的字符'\''t'

示例:

>> double('\t')
ans =
    92   116

即使在过去使用textscan的情况下,这也给我带来了麻烦,所以现在,除了fprintf可以正常工作之外,在其他任何地方我都始终使用ascii代码09制表符,而不是缩写符号'\t'

例如:

tabc = char(09) ;
C= textscan( s , '%s' , 'delimiter',tabc ) ; % or in any other function using 'delimiters'

并演示第一个示例:

>> double('\t')
ans =
    92   116
>> double(tabc)
ans =
     9

有时候没有什么区别,但是如果您在处理 TAB 字符时遇到麻烦,则使用精确的ascii代码将使您不必怀疑它是否已正确解释...

答案 2 :(得分:0)

这可用于按标签拆分:

splitted = strsplit(aLineOfText, '\t');

(它以不同的方式对待行,使我重新编写脚本,但似乎可以正常工作。)