【问题标题】:Octave - dlmread and csvread convert the first value to zeroOctave - dlmread 和 csvread 将第一个值转换为零
【发布时间】:2021-03-27 04:57:51
【问题描述】:

当我尝试在 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 octave


    【解决方案1】:

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

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

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

    另外,检查一下这个文件是如何产生的可能是值得的;如果您在该过程中有任何控制权,也许您可​​以找到为什么首先放置此标记并阻止它。例如,如果这是从 Excel 导出的,您可以选择普通的“csv”格式而不是“utf-8 csv”。

    更新

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

    【讨论】:

    • 感谢您的回答。有道理,那只是一个虚构的样本,真实的东西可能会提供更多的洞察力:file.io/p0qIyXK4MUrE。里面没有我能说出的字母。我认为覆盖内置函数远远超出了我的能力! :)
    • 感谢更新的答案,我很感激。这些文件是在 Excel 中自动创建的,我仍在使用 Octave 5.1.0.0。我现在将尝试最新版本,看看效果如何。作为旁注,我今天早上开始使用 MATLAB 来尝试复制错误。 MATLAB 中的错误提示提供了一些附加信息,它指向您描述的相同内容。再次感谢。
    • @mk1138 最新版本为6.1.0;该错误已在 dev 中修复。即,该修复不会出现在 6.2.0 之前的稳定版本中。
    • 知道了。我重新阅读了您更仔细地链接的错误日志,并通过将文件导出为简单的 csv 而不是 UTF-8 csv 来规避这个问题。毕竟只是数字。你的帖子对我帮助很大,我很感激。
    • 我的荣幸。如果您认为此答案正确回答了您的问题,您可以通过单击“勾选”标记(投票箭头下方的标记)“接受”它。
    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2014-01-08
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2013-07-03
    相关资源
    最近更新 更多