Octave 仅从 CSV 中读取一列 - 未知范围

Octave read just one column from CSV - unknown range

我想阅读包含许多列的 CSV,但我只想阅读其中的一列。我找到函数 dlmread().

“参数的第一种形式是包含左上角和右下角 [R0,C0,R1,C1] 的 4 元素向量,其中索引从零开始”

M = dlmread('/home/lukas/deetction/tile_16.csv,'\t', [2, 1,  unknown, 1])

问题是我不知道会有多少行,每个文件都不一样。我如何定义 R1 以读取尽可能多的行?如果我定义整个范围 [2,1,10,1],该函数可以工作,但是如何定义未知的 R1?

或者我应该读取 CSV 以获得行数未知的一列。

简答:

对未知数 R1 使用 NaN

详细答案:

Octave中,技巧是将未知数R1定义为NaN-inf或任何大于或等于的整数到最大行数,包括 inf。即

‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ 1 ‍‍‍‍‍‍ ∈ ‍‍‍‍‍‍ {, -} ‍‍‍‍‍‍ ∪ ‍‍‍‍‍‍ [ , ]

如果C1未知,您可以选择C1为大于最大列数(不包括inf)的任何整数值。

感谢 AndrasDeak 在 Octave 4.0.3 中对此进行测试。


但是在 MATLAB 中,您可以选择 R1NaN 或任何小于 R0 的整数值,包括 -inf(或者你的情况未知的最大行数)。

‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ 1 ‍‍‍‍‍‍ ∈ ‍‍‍‍‍‍ {, } ‍‍‍‍‍‍ ∪ ‍‍‍‍‍‍ [-, 0-1]

请注意,此技巧仅适用于选择 R1。你不能以同样的方式选择C1


因此,我更喜欢 NaN 对于未知 R1 使代码与两个平台兼容并避免可能的混淆。

在 GNU Octave 4.3.0+(今天是从 4.​​4 版本的源代码和基础构建的开发版本)中,您可以使用 inf 来表示未知大小(这与 Sardar 的答案形成对比) .

这已更改 with this changeset on stable 并将成为 4.2.2 错误修复版本(如果有的话)或下一个稳定版本 4.4 的一部分。

看起来此行为已从 4.0.3

% create sample data 5 rows, 3 columns
x = (1:3)+(10:10:50).'
csvwrite ("foo", x)
clear all
% read second column until end
dlmread ("foo", ",", [0 1 inf 1])

给予

x =

   11   12   13
   21   22   23
   31   32   33
   41   42   43
   51   52   53

ans =

   12
   22
   32
   42
   52