用 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 读取,因为 csvreadxlsread 可以不支持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 文件 - 文件组织得不好的主要内容,如果未能解决你的问题,请参考以下文章

用matlab读取一个csv表格文件并输出函数图像

怎样从matlab中读取csv文件

有效地读取巨大的 csv 文件?

用Matlab读取.csv文件+ JSON

用逗号读取大的 .csv 文件 MATLAB [重复]

从巨大的 CSV 文件中读取随机行