【问题标题】:MATLAB / Octave - how to parse CSV file with numbers and strings that contain commasMATLAB / Octave - 如何解析包含逗号的数字和字符串的 CSV 文件
【发布时间】:2018-04-01 04:55:31
【问题描述】:

我有一个包含 20 列的 CSV 文件。一些列有数字值,其他列有文本值,而文本可能包含也可能不包含逗号。

CSV 内容示例:

column1, column2, column3, column4
"text value 1", 123, "text, with a comma", 25
"another, comma", 456, "other text", 78

我正在使用textscan 函数,但我得到了最多错误和最奇怪的行为。使用一些参数,它只读取一列中的所有值,有时它重复列,并且我尝试过的大多数事情导致逗号被错误地解释为列分隔符(尽管文本用双引号括起来)。也就是说,我尝试指定 'delimiter' 参数,并在格式规范中包含文字,但无济于事。

如上例中调用textscan 处理CSV 文件的正确方法是什么?我正在寻找一种同时在 MATLAB 和 Octave 上运行的解决方案(或者,如果不可能,则在每个解决方案中都使用等效的解决方案)。

【问题讨论】:

    标签: matlab csv octave textscan


    【解决方案1】:

    首先,使用 '%s' 格式读取列标题四次:

    fileID = fopen(filename);
    C_text = textscan(fileID,'%s', 4,'Delimiter',',');
    

    然后使用转换说明符 %q 读取双引号 (") 括起来的文本:

    C = textscan(fileID,'%q %d %q %d','Delimiter',',');
    fclose(fileID);
    

    (这适用于在 Octave 上读取您的示例数据。它也应该适用于 MATLAB。)

    编辑:删除了多余的fopen

    【讨论】:

    • 嗨,我不明白第一条语句的变量C_text 与第二条textscan 的关系。这两个textscan 调用不是彼此无关吗?
    • 嗨,第一个文本扫描只是读取标题并将其存储在 C_text 中。通过这样做,文件指针将指向第二行,并在此处进入第二个 textscan。它将解析文件的其余部分,因为不可能结合两个文本扫描(由于格式不同,一次调用读取标题和数据)。如果您需要将标题与数据放在一个变量中,您可以稍后将 C_text 和 C 连接起来。
    【解决方案2】:

    对于 GNU Octave,使用 io package

    pkg load io
    c = csv2cell ("jota.csv")
    

    给予

    c = 
    {
      [1,1] = column1
      [2,1] = text value 1
      [3,1] = another, comma
      [1,2] =  column2
      [2,2] =  123
      [3,2] =  456
      [1,3] =  column3
      [2,3] =  text, with a comma
      [3,3] =  other text
      [1,4] =  column4
      [2,4] =  25
      [3,4] =  78
    }
    

    顺便说一句,您应该明确提及该解决方案是否应该在 GNU Octave、Matlab 或两者上运行

    【讨论】:

    猜你喜欢
    • 2016-04-15
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多