【发布时间】: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'
我对@987654324@ 参数有什么误解?
我正在使用 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'
奇怪的是,如果我另外取消设置任何先入为主的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
使用格式字符串有助于识别列标题行,但为字符串列保留分隔符周围的空白:
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