【问题标题】:How to read a csv file with varying number of columns in Octave如何在 Octave 中读取具有不同列数的 csv 文件
【发布时间】:2015-11-23 18:19:35
【问题描述】:

我想读取 csv 文件中选定的字符串数据列,其中列的总数因行而异。假设csv文件的内容如下:

line 1: a1,b1,c1,d1,e1
line 2: a2,b2,c2
line 3: a3,b3,c3,d3

我想将第一列读入变量 a,第二列读入变量 b,期望 a 和 b 具有以下值:

a[1,1] = a1, a[2,1] = a2, a[3,1] = a3
b[1,1] = b1, b[2,1] = b2, b[3,1] = b3

我尝试使用 textread 与格式说明符只匹配所需的列:

[a,b] = textread('SampleFile.csv','%s%s','delimiter',',')

但这会产生错误的结果:

a[1,1] = a1, a[2,1] = c1, a[3,1] = e1, a[4,1] = b2, a[5,1] = b3, a[6,1] = d3
b[1,1] = b2, b[2,1] = d1, b[3,1] = a2, b[4,1] = a3, b[5,1] = c3, b[6,1] =

我还尝试使用带有格式说明符的 textread 匹配最大列数,并为不需要的列使用虚拟变量:

[a,b,dummy1,dummy2,dummy3] = textread('SampleFile.csv','%s%s%s%s%s','delimiter',',')

但这也产生了错误的结果:

a[1,1] = a1, a[2,1] = a2, a[3,1] = d3
b[1,1] = b2, b[2,1] = b2, b[3,1] =

有没有办法使用 textread 命令或其他方法仅捕获所需的列?

我在 Mac OS 10.9.5 上运行 Octave 3.8.0。

【问题讨论】:

    标签: csv octave multiple-columns


    【解决方案1】:

    您的输出是预期的,因为它完全模仿了 function documentation 中的示例:

    假设数据文件如下:
    1 a 2 b
    3 c 4 d
    5 e

    [a, b] = textread (f, "%f %s")
    

    返回两列数据,一列是双精度,另一列是 cellstr 数组:

    a = [1; 2; 3; 4; 5]
    b = {"a"; "b"; "c"; "d"; "e"}
    

    你必须逐行阅读你的文本文件才能做你想做的事:

    f = fopen ("test.txt");
    c1 = {};
    c2 = {};
    while (l = fgetl (f)) != -1
      [a b] = strread (l, "%s %s");
      c1 = cat (1, c1, a{1});
      c2 = cat (1, c2, b{1});
    endwhile
    fclose (f);
    

    【讨论】:

    • 我希望有类似于 Matlab 的“textread('SampleFile.csv','%s%s%*[^\n]','delimiter',',')"(其中在 Octave 中不起作用),但您的逐行方法可以完成这项工作。感谢您的解释和解决方案。
    猜你喜欢
    • 2013-09-26
    • 2022-06-30
    • 1970-01-01
    • 2020-12-24
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多