我有几个 .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,但它超级慢,有时会卡住。或者对于真正重要的人来说,它会宣布记忆问题。
任何推荐?
答案 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“,”的行。