用 matlab 读取巨大的 .csv 文件 - 文件组织得不好
Posted
技术标签:
【中文标题】用 matlab 读取巨大的 .csv 文件 - 文件组织得不好【英文标题】:Reading huge .csv files with matlab - file is not well orgenized 【发布时间】:2015-12-10 15:22:11 【问题描述】:我有几个 .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',',');
通过这种方式,我看到 300 万行中有 2 行格式发生了变化。
我想阅读除坏行/不同行之外的所有行。 此外,如果可以仅读取第一个字符串为 'PAA' 的行。有可能吗?
我曾尝试将它直接加载到 matlab,但它超级慢,有时会卡住。或者对于真正大的它会宣布内存问题。
有什么推荐吗?
【问题讨论】:
您的文件包含哪些数据类型? :) 超酷的 GPS 数据 :) 【参考方案1】:对于仍然足够小以适应您的内存的大文件,一次解析所有行通常是最佳选择。
f = fopen('data.txt');
g = textscan(f,'%s','delimiter','\n');
fclose(f);
在下一步中,您必须识别以PAA
开头的行,使用strncmp
。
现在过滤您的数据,将上面的 textscan 表达式应用到每一行。如果失败,请尝试另一个。
【讨论】:
它告诉我下一个错误。警告:不支持编码“windows-1255”。请参阅 FOPEN 的文档。顺便说一句,它是一个 csv 文件【参考方案2】: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 个“,”的行。
【讨论】:
我从未使用过 linuks。我需要下载程序吗?以上是关于用 matlab 读取巨大的 .csv 文件 - 文件组织得不好的主要内容,如果未能解决你的问题,请参考以下文章