【问题标题】:Why does readmatrix in Matlab skip the first n lines?为什么 Matlab 中的 readmatrix 会跳过前 n 行?
【发布时间】:2020-06-16 15:46:19
【问题描述】:

在我的模拟中,我使用writematrix 将数据写入文件,然后使用readmatrix 将其读回。我在每个时间步都附加到一个文件,每一行的长度与前一行相同或更长。

由于某种原因,在输出文件上使用readmatrix 时,前 n 行将被完全跳过,就像根本没有读取一样。例如,我的文件如下所示:

...
11.8,1,2,3,4,5,6,7,8,9,10,2
11.9,1,2,3,4,5,6,7,8,9,10,2
...
12.3,1,2,3,4,5,6,7,8,9,10,2
12.4,7,8,9,10,7,8,9,10,1,2,1,1,2,3,4,5,6,3,4,5,6,1
12.5,7,8,9,10,7,8,9,10,1,2,1,1,2,3,4,5,6,3,4,5,6,1
...
30.5,7,8,9,10,7,8,9,10,1,2,2,1,2,3,4,5,6,3,4,5,6,2
30.6,7,8,9,10,7,8,9,10,1,2,2,1,2,3,4,5,6,3,4,5,6,2
30.7,17,18,19,20,1,2,7,8,9,10,1,1,2,3,4,5,6,3,4,5,6,2,11,12,13,14,15,16,7,8,9,10,1
30.8,17,18,19,20,1,2,7,8,9,10,1,1,2,3,4,5,6,3,4,5,6,2,11,12,13,14,15,16,7,8,9,10,1
...

(第一列是时间戳,所以第一个省略号代表t=0到t=11.7。在t=30.7时条目数又有一步跳跃),当我使用命令读取时

data = readmatrix('/path/to/file/data.csv');

矩阵data 看起来像

12.4 7 8 9 10 7 8 9 10 1 2 1 1 2 3 4 5 6 3 4 5 6 1
12.5 7 8 9 10 7 8 9 10 1 2 1 1 2 3 4 5 6 3 4 5 6 1
12.6 7 8 9 10 7 8 9 10 1 2 1 1 2 3 4 5 6 3 4 5 6 1
...
30.5 7 8 9 10 7 8 9 10 1 2 2 1 2 3 4 5 6 3 4 5 6 2
30.6 7 8 9 10 7 8 9 10 1 2 2 1 2 3 4 5 6 3 4 5 6 2
30.7 17 18 19 20 1 2 7 8 9 10 1 1 2 3 4 5 6 3 4 5 6 2 11 12 13 14 15 16 7 8 9 10 1
30.8 17 18 19 20 1 2 7 8 9 10 1 1 2 3 4 5 6 3 4 5 6 2 11 12 13 14 15 16 7 8 9 10 1
...

也就是说,t=12.4之前的所有条目(即行长的第一步跳跃)都被跳过。 在文件中,如果我在第一步跳转之前删除所有内容(即 t=12.4 之前的所有内容),那么我会得到相同的矩阵data,因此我们可以得出后续步骤跳转没有问题的结论。如果我从第二步跳转中删除所有内容(即 t=30.6 之后的所有内容),那么它仍然会跳过 t=12.4 之前的所有条目。如果我没有跳步(即只有 t=0 到 t=12.3),那么它会愉快地读取第一行。

我尝试使用 csvread 读取同一个文件,它会返回文件开头的所有数据(尽管用零而不是 nan 填充),所以我确信问题不在于文件。

为什么会这样?

一个最小的工作示例是第一个没有省略号的代码块。

作为参考,第一行有 12 个 csv,每一步跳转增加 11

编辑:

来自detectImportOptions的输出

ans = 

  DelimitedTextImportOptions with properties:

   Format Properties:
                    Delimiter: {','}
                   Whitespace: '\b\t '
                   LineEnding: {'\n'  '\r'  '\r\n'}
                 CommentStyle: {}
    ConsecutiveDelimitersRule: 'split'
        LeadingDelimitersRule: 'keep'
                EmptyLineRule: 'skip'
                     Encoding: 'UTF-8'

   Replacement Properties:
                  MissingRule: 'fill'
              ImportErrorRule: 'fill'
             ExtraColumnsRule: 'addvars'

   Variable Import Properties: Set types by name using setvartype
                VariableNames: {'Var1', 'Var2', 'Var3' ... and 20 more}
                VariableTypes: {'double', 'double', 'double' ... and 20 more}
        SelectedVariableNames: {'Var1', 'Var2', 'Var3' ... and 20 more}
              VariableOptions: Show all 23 VariableOptions 
    Access VariableOptions sub-properties using setvaropts/getvaropts
        PreserveVariableNames: false

   Location Properties:
                    DataLines: [4 Inf]
            VariableNamesLine: 0
               RowNamesColumn: 0
            VariableUnitsLine: 0
     VariableDescriptionsLine: 0 
    To display a preview of the table, use preview

【问题讨论】:

  • 尝试在您的文件上运行detectImportOptions(),看看会告诉您什么。我打赌readmatrix 正试图变得“聪明”并找到实际上是二维矩阵的区域。
  • @AndrewJanke,感谢您的提示。我看过了,我不确定我在找什么。有一行写着EmptyLineRule: 'skip',所以也许它把它当作一个空行?从文档detectImportOptions 看起来它是用于表格的 - 我不知道如何将该信息转换为readmatrix 的上下文
  • 您能否将detectImportOptions 结果的完整显示作为您问题的一部分发布,以便我们查看?也许还有一个链接可以下载您的 CSV 文件,以便我们轻松复制?
  • DataLines: [4 Inf] 看起来很可疑。如果您将其强制为[1 Inf],然后调用readmatrix,显式传入您拥有的修改后的DelimitedTextImportOptions 对象,会发生什么?
  • 如果您想从一开始就正确执行此操作,请致电readmatrix(path2mat,delimitedTextImportOptions('DataLines',[0,Inf])) 并立即指定选项。这个option 没有默认设置,所以也许你的文件的第 4 行中有一些东西让 MATLAB 认为这是一个标题......

标签: matlab csv file


【解决方案1】:

Matlab 的readmatrix 正试图变得聪明并在您传递的 CSV 文件的数据模型中找到一个二维矩阵。看起来它正在通过前几行没有明确的尾随空“单元格”。

您可以通过设置导入选项来控制它。在您的文件上运行 opts = detectImportOptions(...); 并查看 DataLines 属性。如果它不是从 1 开始,请将其设置为 [1 Inf] 以强制 readmatrix 读取所有行。然后调用readmatrix,显式传入该选项结构。

要紧凑地执行此操作(并且可能更有效),请立即使用显式选项调用 readmatrix,如下所示:

readmatrix(path2mat,delimitedTextImportOptions('DataLines',[0,Inf]))

【讨论】:

    猜你喜欢
    • 2015-02-26
    • 1970-01-01
    • 2021-02-18
    • 2021-10-25
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多