Matlab 的 "readtable" 是否识别列标题?

Have Matlab's "readtable" recognize column headings?

我有以下 CSV 文件,第 1 行有列标题:

Test.csv
--------
Prj  , Cap
A    ,  1
A    ,  2
H    ,  4
H    ,  5

我试图将其读入 table,但我无法让 readtable 识别第 1 行的列标题:

readtable( 'Test.csv' , ...
           delimitedTextImportOptions( 'VariableNamesLine' , 1 ) )

Var1     ExtraVar1
_____    _________
'Prj'     ' Cap'  
'A'       '  1'   
'A'       '  2'   
'H'       '  4'   
'H'       '  5'   

我对VariableNamesLine参数有什么误解?

我正在使用 Matlab 2019a。 doc delimitedTextImportOptions显示是在Matlab 2016b中引入的,我是运行 Matlab 2019a。

故障排除步骤

这里是 delimitedTextImportOptions object:

dtio = delimitedTextImportOptions( 'VariableNamesLine' , 1)

     DelimitedTextImportOptions with properties:
      Format Properties:
                       Delimiter: {','}
                      Whitespace: '\b\t '
                      LineEnding: {'\n'  '\r'  '\r\n'}
                    CommentStyle: {}
       ConsecutiveDelimitersRule: 'split'
           LeadingDelimitersRule: 'keep'
                   EmptyLineRule: 'skip'
                        Encoding: 'system'
      Replacement Properties:
                     MissingRule: 'fill'
                 ImportErrorRule: 'fill'
                ExtraColumnsRule: 'addvars'
      Variable Import Properties: Set types by name using setvartype
                   VariableNames: {'Var1'}
                   VariableTypes: {'char'}
           SelectedVariableNames: {'Var1'}
                 VariableOptions: Show all 1 VariableOptions
      Access VariableOptions sub-properties using setvaropts/getvaropts
      Location Properties:
                       DataLines: [1 Inf]
               VariableNamesLine: 1
                  RowNamesColumn: 0
               VariableUnitsLine: 0
        VariableDescriptionsLine: 0

如果我将 ReadVariableNames 指定为 true,则仅识别 first 列标题。它仍然在数据中重复出现。

readtable( 'Test.csv' , dtio , 'ReadVariableNames',true )

     Prj     ExtraVar1
    _____    _________
    'Prj'     ' Cap'
    'A'       '  1'
    'A'       '  2'
    'H'       '  4'
    'H'       '  5'

我可以通过显式指定 DataLines 来避免将标题读取为数据,但第二列标题仍未读取。

dtio = delimitedTextImportOptions( ...
  'VariableNamesLine' , 1 , ...
  'DataLines' , [2 Inf] );
readtable( 'Test.csv' , dtio , 'ReadVariableNames',true )

Prj    ExtraVar1
___    _________
'A'      '  1'
'A'      '  2'
'H'      '  4'
'H'      '  5'

奇怪的是,如果我另外取消设置任何先入为主的 VariableNames:

DataLines 规范将被忽略
dtio = delimitedTextImportOptions( ...
  'VariableNamesLine' , 1 , ...
  'DataLines' , [2 Inf] , ...
   'VariableNames' , {} );
readtable( 'Test.csv' , dtio , 'ReadVariableNames',true )

    ExtraVar1    ExtraVar2
    _________    _________
     'Prj  '      ' Cap'
     'A    '      '  1'
     'A    '      '  2'
     'H    '      '  4'
     'H    '      '  5'

根据回复中的建议,我尝试了默认的 readtable 选项。不幸的是,这没有将 , 识别为分隔符:

readtable('Test.csv')

Warning: Table variable names were modified to make them valid MATLAB identifiers. The original names are saved in the VariableDescriptions property. 

    Prj    x_     Cap
    ___    ___    ___
    'A'    ','     1 
    'A'    ','     2 
    'H'    ','     4 
    'H'    ','     5 

使用格式字符串有助于识别列标题行,但分隔符周围的白色 space 保留用于字符串列:

readtable('Test.csv', 'Format', '%s%u')

      Prj      Cap
    _______    ___
    'A    '     1 
    'A    '     2 
    'H    '     4 
    'H    '     5 

无论 Test.csv 有 Unix 还是 DOS 行尾,我得到的结果都是一样的。

我会继续调查、阅读和实验。

P.S。很奇怪,但是 Matlab Central 的 Matlab Answers 论坛不让我 post 这个问题(来这里之前)。我可以为主题标题输入文本,但无论我点击多少次,消息 body 中都没有出现插入点。它发生在同时使用 Firefox 和 Edge 的情况下。

从 R2020a 开始,您可以直接使用

readtable('Test.csv')

命令自动指示跳过headers的第一行。每列的数据类型将从数据本身推断出来。

或者,您可以使用命令选项 'Format':

指定每列的数据类型
readtable('Test.csv', 'Format', '%s%u')

这会将您的第一列读取为字符串,将第二列读取为无符号整数(对于有符号整数,请使用 %i)。