如何使用八度中的空值解析CSV文件?

问题描述 投票:0回答:2

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

matlab csv octave
2个回答
1
投票

例如,设置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

我对此没有解释;可能是一个错误?如果您以后可以自己删除双引号,那么(仍然)可以为您找到解决方案。

希望有帮助!


0
投票

看来这是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,,

这不是一个很好的解决方案,只是对现有错误的解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.