【发布时间】:2020-07-13 15:08:45
【问题描述】:
我正在尝试使用 textscan 读取 Octave 中的 CSV 文件,但 CSV 文件的格式并不总是正确。以下 mcve 应说明问题:
假设文件如下:
12/01/2020,12,1,2020,0,0,Russia,RU,RUS,145872260,Europe,0
11/01/2020,11,1,2020,0,0,Russia,RU,RUS,145872260,Europe,0
10/01/2020,10,1,2020,0,0,Russia,RU,RUS,145872260,Europe,0
09/01/2020,9,1,2020,0,0,Russia,RU,RUS,145872260,Europe,0
08/01/2020,8,1,2020,0,0,Russia,RU,RUS,145872260,Europe,0
07/01/2020,7,1,2020,0,0,Russia,RU,RUS,145872260,Europe,
06/01/2020,6,1,2020,0,0,Russia,RU,RUS,145872260,Europe,
05/01/2020,5,1,2020,0,0,Russia,RU,RUS,145872260,Europe,
您会注意到最后 3 行中缺少最后的 0。显然,我可以进入并在 Notepad++ 或类似工具中手动编辑 CSV 文件,但我们正在谈论数万行,我只是觉得必须有更好的解决方案。
我的代码是这样的(请注意,我尝试使用 %*f 作为最后一个元素来告诉 Octave 跳过它,但这似乎不起作用):
fname = 'mcve.csv'; % the above file
fid = fopen(fname);
csv_data = textscan(fid,'%s %d %d %d %d %d %s %s %s %d %s %*f','Delimiter',',');
fclose(fid);
如果您再查看csv_data,您会发现日期不正确(其余数据看起来正常):
>> csv_data{1}
ans =
{
[1,1] = 12/01/2020
[2,1] = 11/01/2020
[3,1] = 09/01/2020
[4,1] = 08/01/2020
[5,1] = 07/01/2020
[6,1] = /01/2020
[7,1] = /01/2020
}
除了我已经尝试过的%*f 之外,还有什么想法可以解决这个问题吗?
【问题讨论】:
-
是您需要适应尾随 0 的存在或缺失的唯一变体吗?无论如何,具有智能查找/替换功能的 Notepad++ 可能会快得多。将“Europe”替换为“Europe,0”,然后将所有“,00”替换为“,0”。其他变体可能也一样快。
-
还没有尝试过,但另一种方法可能是删除分隔符语句,将逗号添加到格式字符串中,并在 %s 中包含 ',0' 和 'Europe '。读取数据后,分别对缺失的0进行解析修正。
-
是的,缺少的尾随 0 是我唯一想要适应的东西。答案中建议的
csv2cell选项似乎效果很好。