大文本文件处理

时间:2010-11-26 12:00:46

标签: import wolfram-mathematica text-processing

我需要在Mathematica中实现延迟加载。我有一个600 MB的CSV文本文件,我需要处理。该文件包含大量重复记录:

1;0;0;13;6
1;0;0;13;6
..........
2;0;0;13;6
2;0;0;13;6
..........
etc.

因此,我不想将它们全部加载到内存中,而是创建一个包含记录的列表以及在文件中遇到此记录的次数:

{{10000,{1,0,0,13,6}}, {20000,{2,0,0,13,6}}, ...}

我找不到使用导入功能的方法。我正在寻找像

这样的东西
Import["my_file.csv", "CSV", myProcessingFunction]

其中myProcessingFunction将一次获取一条记录并创建数据集。是否可以使用Import或任何其他Mathematica函数执行此操作?

4 个答案:

答案 0 :(得分:2)

我想你想要Read[]功能。

答案 1 :(得分:2)

也许有比Mathematica更好的选择。

一个小awk脚本:

 {a[$0]++}  
 END { ... print loop ... }

将累积重复的记录。当然,根据不同记录的数量,您可能会遇到溢出。

首先

排序文件,计数不会溢出。在awk中,非溢出程序可能类似于;

 BEGIN{ p =""; i=0}

 {if (($0 != p) &&  (i != 0) ) {print $0,i ; p =$0; i=0; next}}

 {i++; p = $0}  

也许Perl更好,但我老了。

HTH!

答案 2 :(得分:2)

如果是我,我可能会使用unix sortuniq这样做,但是因为你问Mathematica ....我会使用ReadList []来读取行块,并定义下限值以找到唯一的字符串,并跟踪我们之前见过的数量。

(* Create some test data *)
Export["/tmp/test.txt", Flatten[{Range[1000], Range[1000]}], "Lines"];

countUniqueLines[file_String, blockSize_Integer] := Module[{stream, map, block, keys, out}, 
    map[_]:=0;
    stream = OpenRead[file];
    CheckAbort[While[(block=ReadList[stream, String, blockSize])=!={}, 
        (map[#]=map[#]+1)& /@ block;];, Close[stream];Clear[map]];
    Close[stream];
    keys = Cases[DownValues[map][[All, 1, 1, 1]], _String];
    out = {#, map[#]}& /@ keys;
    Clear[map];
    out
]

countUniqueLines["/tmp/test.txt", 500]


(* Alternative implementation if you have a little more memory *)
Tally[Import["/tmp/test.txt", "Lines"]]

答案 3 :(得分:0)

我建议您先考虑将其加载到像MySQL这样的数据库系统中,然后使用DatabaseLink从 Mathematica 访问它。