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
)。
我有以下 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
)。