【问题标题】:Have Matlab's "readtable" recognize column headings?Matlab 的“可读”可以识别列标题吗?
【发布时间】:2021-08-03 08:24:15
【问题描述】:

我在第 1 行有以下带有列标题的 CSV 文件:

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

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

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

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

我对@9​​87654324@ 参数有什么误解?

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

故障排除步骤

这里是delimitedTextImportOptions 对象:

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'

奇怪的是,如果我另外取消设置任何先入为主的VariableNamesDataLines 规范就会被忽略:

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 

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

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

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

无论Test.csv 是 Unix 还是 DOS 行结尾,我都会得到相同的结果。

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

附:很奇怪,但是 Matlab Central 的 Matlab Answers 论坛不允许我发布这个问题(在来这里之前)。我可以输入主题标题的文本,但无论我点击多少,消息正文中都不会出现插入点。它同时使用 Firefox 和 Edge。

【问题讨论】:

    标签: matlab matlab-table


    【解决方案1】:

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

    readtable('Test.csv')
    

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

    或者,您可以使用命令选项'Format' 指定每列的数据类型:

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

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

    【讨论】:

    • 谢谢。我正在运行 Matlab 2019a。我已经添加了对您的代码模式进行试验的结果。这对我来说不太适用。我正在继续实验。
    • 我找到了解决我在使用 tTest=readtable('Test.csv', 'Format', '%s%u') 时遇到的皱纹的方法。字符串变量/列数据保留了分隔符之前的尾随空格,如我发布的问题中所述。受影响的列是tTest.Prj。修复是tTest.Prj=categorical(tTest.Prj)
    • 处理这个更直接的方法似乎是以某种方式将WhitespaceRule 设置为trim,但WhitespaceRule 不是delimitedTextImportOptions 返回的对象的属性。对于 Matlab 2019 的 doc,它显示在 detectImportOptions 中,但没有解释。在setvaropts 中有解释,应用于detectImportOptions 返回的对象。两者都暗示需要探索导入过程才能使用WhitespaceRule。特别是,需要初步识别和表征变量/列。这比我想要的要复杂得多。
    • 经过所有这些修补,您将陷入困境……我认为更新到当前版本可能是您的最佳选择
    • 很遗憾,这不是我的决定。这是美元的问题,总是有相互冲突的需求。这些天来,由于竞争激烈的分析环境,它变得越来越难。
    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多