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 或两者上
我有一个包含 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 或两者上