倍频程-dlmread和csvread将第一个值转换为零

倍频程-dlmread和csvread将第一个值转换为零,csv,octave,Csv,Octave,当我试图以八度音阶读取csv文件时,我意识到它的第一个值被转换为零。我尝试了csvread和dlmread,但没有收到任何错误。我能够在纯文本编辑器中打开文件,并且可以在那里看到正确的值。据我所知,csv文件中没有有趣的隐藏字符、间距或类似内容。文件也只包含数字。我觉得唯一重要的是我有五个列/组,每个列/组中有不同数量的值 我查阅了司令部关于Octave Forge的文档,我不知道是什么原因造成的。有人知道我能解决什么问题吗 为了说明问题,如果我尝试加载包含以下内容的文件: 1.1,2.1,3.

当我试图以八度音阶读取csv文件时,我意识到它的第一个值被转换为零。我尝试了
csvread
dlmread
,但没有收到任何错误。我能够在纯文本编辑器中打开文件,并且可以在那里看到正确的值。据我所知,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")

它们都返回相同的值。

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

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

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

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

更新


事实上,这个问题似乎已经作为一个bug提交,并在octave的开发分支中修复。请参阅:)

谢谢您的回答。有道理,这只是一个虚构的样本,真实的东西可能提供更多的洞察力:。里面没有我能看出来的字母。我认为覆盖内置函数远远超出了我的能力!:)谢谢你更新的答案,我很感激。这些文件是在Excel中自动创建的,我仍然使用Octave 5.1.0.0。我现在就试试最新的版本,看看效果如何。顺便说一句,今天早上我接触了MATLAB,试图复制错误。MATLAB中的错误提示提供了一些附加信息,它指向与您描述的相同的内容。再次感谢。@mk1138最新版本是6.1.0;该漏洞已在dev中修复。也就是说,在6.2.0.0发布之前,该修复不会出现在稳定版本中。我重新仔细阅读了您链接的错误日志,并通过将文件导出为简单的csv(而不是UTF-8 csv)来避免这个问题。毕竟这只是数字。你的帖子帮了我很大的忙,我真的很感激。我的荣幸。如果您认为此答案正确回答了您的问题,您可以通过单击“勾选”标记(投票箭头下的标记)来“接受”它。
dt = dlmread("FileName.csv",",")