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



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

我浏览了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,

命令窗口将返回:

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",",")

而且它们都返回相同的值。

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

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

在我的文本编辑器中,如果我从文件的左上角开始,按一次右箭头键,你就可以看出光标没有移动(这意味着我刚刚越过了不可见的字节顺序标记,它不占用可见的空间(。此时按退格键删除字节顺序标记可以正确读取csv。或者,您可能需要在十六进制编辑器中修复文件,或者找到其他方法将其转换为正确的Ascii文件(或不带字节顺序标记的UTF(。

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

更新

事实上,这个问题似乎已经作为一个bug提交,并在倍频程的开发分支中得到了修复。参见#58813:(

相关内容

  • 没有找到相关文章

最新更新