使用matlab读取巨大的.csv文件 - 文件没有很好地发生

时间:2015-12-10 15:22:11

标签: matlab csv

我有几个 .csv 文件,我用matlab使用 textscan 读取,因为 csvread xlsread 不支持200Mb-600Mb文件的大小。

我用这一行来阅读它:

C = textscan(fileID,'%s%d%s%f%f%d%d%d%d%d%d%d','delimiter',',');

我发现有时数据不是这种格式然后 textscan 停止读取该行而没有任何错误的问题。

所以我所做的就是以这种方式阅读

C = textscan(fileID,'%s%d%s%f%f%s%s%s%s%s%s%s%s%s%s%s','delimiter',',');

通过这种方式,我看到3百万分之一的行中有两行格式发生了变化。

我想读除除坏/不同行之外的所有行。 此外,如果只能读取第一个字符串' PAA' 的行。有可能吗?

我曾尝试将其直接加载到matlab,但它超级慢,有时会卡住。或者对于真正重要的人来说,它会宣布记忆问题。

任何推荐?

2 个答案:

答案 0 :(得分:3)

对于仍然小到足以满足您内存的大型文件,一次解析所有行通常是最佳选择。

f = fopen('data.txt');             
g = textscan(f,'%s','delimiter','\n');
fclose(f);

在下一步中,您必须确定以PAA使用strncmp开头的行。

现在已过滤数据,请将上面的文本扫描表达式应用于每一行。如果失败,请尝试另一个。

答案 1 :(得分:0)

Matlab在这种情况下很慢,因为它需要将所有内容加载到内存中。我建议使用grep / bash / cmd行将文件缩减为可读行,然后再在Matlab中处理它们,在Linux中你可以:

awk '{if (p ~ /^PAA/ && $1 ~ /^PAA/) print; p=$1}' yourfile.csv > yourNewFile.csv   %// This will give you a new file with all the lines that starts with PAA (NOTE: Case sensitive)

要查找格式不同的行,您可以使用:

awk -F ','  'NF = 12 {print NR, $0} ' yourfile.csv > yourNewFile.csv

此行查看每行的12个分隔符,并丢弃任何超过12“,”的行。