Max*_*Max 6 import text-processing wolfram-mathematica
我需要在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.
Run Code Online (Sandbox Code Playgroud)
因此,我不想将它们全部加载到内存中,而是创建一个包含记录的列表以及在文件中遇到此记录的次数:
{{10000,{1,0,0,13,6}}, {20000,{2,0,0,13,6}}, ...}
Run Code Online (Sandbox Code Playgroud)
我找不到使用导入功能的方法.我正在寻找类似的东西
Import["my_file.csv", "CSV", myProcessingFunction]
Run Code Online (Sandbox Code Playgroud)
其中myProcessingFunction将一次获取一条记录并创建数据集.是否可以使用Import或任何其他Mathematica功能执行此操作?
如果是我,我可能会使用 unixsort
和来完成此uniq
操作,但是既然您询问 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"]]
Run Code Online (Sandbox Code Playgroud)