我有以下要在Octave中解析的CSV数据。请注意,最后一列中的值为空:
102,19700101,,0.485,
111,19700101,,0.48,
我将行格式定义为:
lineFormat = [repmat('%s',1,1), ...
repmat('%f',1,1), ...
repmat('%q',1,1), ...
repmat('%f',1,1), ...
repmat('%q',1,1)];
如何用textscan
读入?当我尝试时:
C = textscan(fid, lineFormat, 'Delimiter', ',')
我不正确地得到以下信息(注意,CSV的第二行已移位):
C =
{
[1,1] =
{
[1,1] = 102
[2,1] = 19700101
}
[1,2] =
1.9700e+07
NaN
[1,3] =
{
[1,1] =
[2,1] = 0.48
}
[1,4] =
0.48500
110.00000
[1,5] =
{
[1,1] = 111
[2,1] = 19700101
}
}
我也尝试过使用'MultipleDelimsAsOne'
,但最后一列的值仍被省略。如何使用textscan
正确读取CSV数据?该代码可以在MATLAB中正常工作,但不能在Octave中工作。
在Ubuntu 16.04上运行Octave 4.2.2。
例如,设置EndOfLine
参数对我有所帮助(Windows 10,Octave 5.1.0):
EndOfLine
输出似乎正确:
C = textscan(fid, lineFormat, 'Delimiter', ',', 'EndOfLine', '\n')
现在我想测试您的C =
{
[1,1] =
{
[1,1] = 102
[2,1] = 111
}
[1,2] =
19700101
19700101
[1,3] =
{
[1,1] =
[2,1] =
}
[1,4] =
0.48500
0.48000
[1,5] =
{
[1,1] =
[2,1] =
}
}
列并扩展您的示例:
%q
不幸的是,以上解决方案在此处无法正常工作:
102,19700101,,0.485,
111,19700101,,0.48,
111,19700101,,0.48,"test"
111,19700101,"test",0.48,
但是,当从C =
{
[1,1] =
{
[1,1] = 102
[2,1] = 111
[3,1] = 111
[4,1] =
}
[1,2] =
19700101
19700101
19700101
111
[1,3] =
{
[1,1] =
[2,1] =
[3,1] =
[4,1] = 19700101
}
[1,4] =
0.48500
0.48000
0.48000
[1,5] =
{
[1,1] =
[2,1] =
[3,1] = test
}
}
中的%q
切换到%s
时,它按预期方式工作:
lineformat
我对此没有解释;可能是一个错误?如果您以后可以自己删除双引号,那么(仍然)可以为您找到解决方案。
希望有帮助!
看来这是Octave中的错误:C =
{
[1,1] =
{
[1,1] = 102
[2,1] = 111
[3,1] = 111
[4,1] = 111
}
[1,2] =
19700101
19700101
19700101
19700101
[1,3] =
{
[1,1] =
[2,1] =
[3,1] =
[4,1] = "test"
}
[1,4] =
0.48500
0.48000
0.48000
0.48000
[1,5] =
{
[1,1] =
[2,1] =
[3,1] = "test"
[4,1] =
}
}
我通过在我的CSV文件的末尾添加一个逗号来解决这个问题,这些文件的行以逗号结尾。由于八度忽略了最后一个逗号,因此添加第二个逗号会使八度不忽略倒数第二个:
https://savannah.gnu.org/bugs/index.php?57612
这里是一个外壳一线式,可修复目录中的所有CSV文件:
102,19700101,,0.485,,
111,19700101,,0.48,,
这不是一个很好的解决方案,只是对现有错误的解决方法。