读取分隔线的定界文件

时间:2018-09-10 17:56:46

标签: python csv numpy

如果对此有明显的答案,我深表歉意。

我有一个很大的文件,对解析提出了一些挑战。这些文件是从组织外部提供的,因此没有机会更改它们的格式。

首先,文件是用空格分隔的,但是表示数据“列”的字段可以跨越多行。例如,如果您有一行应为25列数据,则该行可能会写入文件:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
   15 16 17 18 19 20 21 
  22 23 24 25
1 2 3 4 5 6 7 8 9 10 11 12 13
   14 15 16 17 18
  19 20 21 22 23 24 25

如您所见,我不能依靠每组数据都在同一行上,但是我可以依靠每组中相同数量的列。

更糟糕的是,该文件遵循definition:data类型格式,其中前3行左右将描述数据(包括一个告诉我有多少行的字段),接下来的N行是数据。然后它将再次回到3行格式以描述下一组数据。这意味着我不能只为N列格式设置阅读器,而让它运行到EOF。

恐怕内置的python文件读取功能会很快变得非常丑陋,但是我无法在csv或numpy中找到任何有效的方法。

有什么建议吗?

编辑:作为其他解决方案的示例:

我们在MATLAB中有一个旧工具,可以在打开的文件句柄上使用textscan解析此文件。我们知道列数,所以我们做类似的事情:

data = textscan(fid, repmat('%f ',1,n_cols), n_rows, 'delimiter', {' ', '\r', '\n'}, 'multipledelimsasone', true);

无论数据如何包装,它都会读取数据,同时保持文件句柄打开以稍后处理下一部分。这样做是因为文件太大,可能导致过多的RAM使用。

1 个答案:

答案 0 :(得分:0)

这是一个草图,您可以如何进行: (编辑:进行一些修改)

{'Obj ID': 'Value'}
{'13': '41.0'}
{'14': '14.0'}
{'13': '41.0'}
{'14': '14.0'}
{'Obj ID': 'Value', '13': '41.0', '14': '14.0'}
14
14.0
14.0
Test Passed