【问题标题】:Reading huge .csv files with matlab - file is not well orgenized用 matlab 读取巨大的 .csv 文件 - 文件组织得不好
【发布时间】: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 数据 :)

标签: matlab csv


【解决方案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。我需要下载程序吗?
猜你喜欢
  • 1970-01-01
  • 2020-08-05
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 2019-03-25
相关资源
最近更新 更多