Octave - dlmread 和 csvread 将第一个值转换为零

Octave - dlmread and csvread convert the first value to zero

当我尝试在 Octave 中读取 csv 文件时,我意识到它的第一个值被转换为零。我尝试了 csvreaddlmread 并且没有收到任何错误。我可以在纯文本编辑器中打开该文件,并且可以在那里看到正确的值。据我所知,csv 文件中没有有趣的隐藏字符、空格或类似内容。文件也只包含数字。我觉得唯一重要的是我有五个 columns/groups,每个都有不同数量的值。

我查看了 Octave Forge 上的命令文档,但不知道是什么原因造成的。有谁知道我可以解决什么问题?

为了说明问题,如果我尝试加载包含以下内容的文件:

1.1,2.1,3.1,4.1,5.1 
,2.2,3.2,4.2,5.2 
,2.3,3.3,4.3, 
,,3.4,4.4 
,,3.5,

命令window将return:

0.0,2.1,3.1,4.1,5.1 
,2.2,3.2,4.2,5.2 
,2.3,3.3,4.3, 
,,3.4,4.4 
,,3.5,

(小数点后附加尾随零)。

我使用的命令语法是:

dt = csvread("FileName.csv")

dt = dlmread("FileName.csv",",")

他们都return一样。

您的 csv 文件在第一个数字之前包含一个 Byte Order Mark。如果您在十六进制编辑器中打开该文件,您可以确认这一点,您将在数字开始之前看到序列 EF BB BF。

这导致第一个条目被解释为 'string',并且由于字符串是根据字符串序列的 'front' 中是否有数字来解析的,因此它被解析为数字零. (有关如何解析 csv 条目的更多详细信息,另请参阅 )。

在我的文本编辑器中,如果我从文件的左上角开始,然后按一次向右箭头键,您会发现光标没有移动(这意味着我刚刚越过了不可见的字节订单标记,不可见 space)。此时按backspace删除字节序标记,可以正常读取csv。或者,您可能需要在十六进制编辑器中修复您的文件,或者找到其他方法将其转换为正确的 Ascii 文件(或没有字节顺序标记的 UTF)。

另外,可能值得检查一下这个文件是如何生成的;如果你在那个过程中有任何控制,也许你可以找到为什么这个标记放在第一位并阻止它。例如,如果这是从 Excel 导出的,您可以选择纯 'csv' 格式而不是 'utf-8 csv'。

更新

其实这个issue好像已经作为bug提交了,在octave的开发分支修复了。参见 #58813 :)