【问题标题】:Importing ASCII tab-delimited line by line with spaces in values使用值中的空格逐行导入 ASCII 制表符分隔
【发布时间】:2019-04-22 17:53:20
【问题描述】:

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'...

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

【问题讨论】:

    标签: matlab csv


    【解决方案1】:

    here 类似的问题。你可以试试:

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

    这一行输出一个包含所有值的单元格 C。查看 Matlab 的 textscan 文档。

    【讨论】:

      【解决方案2】:

      使用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 代码将使您不必怀疑它是否被正确解释...

      【讨论】:

        【解决方案3】:

        这适用于按标签拆分:

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

        (它以不同的方式处理这些行并让我重新编写脚本,但似乎可以正常工作。)

        【讨论】:

          猜你喜欢
          • 2018-10-25
          • 1970-01-01
          • 2018-04-15
          • 1970-01-01
          • 2013-08-17
          • 1970-01-01
          • 1970-01-01
          • 2017-08-11
          • 1970-01-01
          相关资源
          最近更新 更多