MATLAB / Octave - 如何使用包含逗号的数字和字符串解析 CSV 文件

MATLAB / Octave - how to parse CSV file with numbers and strings that contain commas

我有一个包含 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 上运行的解决方案(或者,如果这不可能,则在每个解决方案中使用等效解决方案)。

首先,使用格式“%s”阅读 headers 列四次:

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

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

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

(这适用于在 Octave 上读取样本数据。它也应该适用于 MATLAB。)

编辑:删除多余的 fopen.

对于 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 或两者上