[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 【已解决】文本记录数值庞大,如何实现按出现次数排序

本帖最后由 思想之翼 于 2023-6-30 15:43 编辑

下述代码将文本记录数值,按出现次数排序:
331 445 550 567
008 023 327 550 689
142 350 331 449 550 653
结果为:
550 (出现3次)
331 (出现2次)
445 550 567 008 023 327 689 142 350 449 653 (出现1次)
  1. @set @n=0;/* & echo off
  2. set "x=1000"
  3. md "文件夹2" 2>nul
  4. pushd "文件夹1\"
  5. dir /b *.txt|cscript -nologo -e:jscript "%~0" "%x%"
  6. pause & exit/b & rem */
  7. fso = new ActiveXObject("Scripting.FileSystemObject");
  8. while (!WScript.StdIn.AtEndOfStream) {
  9.     f = WScript.StdIn.ReadLine();
  10.     try {
  11.         txt = fso.OpenTextFile(f, 1).ReadAll();
  12.         txt = getMaxNum(txt, WScript.Arguments(0));
  13.     } catch(e) { txt = "" }
  14.     fso.CreateTextFile("..\\文件夹2\\"+f, true).Write(txt);
  15. }
  16. function getMaxNum(str, arg) {
  17.     dic = new ActiveXObject("Scripting.Dictionary");
  18.     for (i=1000; i<=1999; i++) {
  19.         num = (i + "").substr(1);
  20.         k = str.split(num).length;
  21.         if (k > 1) {
  22.             if (dic.Exists(k)) {
  23.                 dic.Item(k) += " " + num;
  24.             } else dic.Add(k, num)
  25.         }
  26.     }
  27.     ar = (new VBArray(dic.Keys())).toArray();
  28.     s = "";
  29.     ar.sort(function(x,y){return y-x});
  30.     if (arg > ar.length) arg = ar.length;
  31.     for (i=0; i<arg; i++) {
  32.         s += dic(ar[i]) + "\r\n";
  33.     }
  34.     return s
  35. }
复制代码
问题:若文本记录数值达3GB,该代码出错。
请教:有无其他方法,实现按出现次数排序?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 思想之翼 于 2023-6-26 18:13 编辑

回复 2# jyswjjgdwtdtj

cscript.e×e-应用程序错误
0x000007FFA4A432751指令用了00000000143009000内存。该内存不能为written。
要终止程序,请弹击确定。

TOP

回复 10# hfxiang

感谢!gawk代码单独使用,结果正确。若在如下循环语句中使用,则结果为空。恳望指点。

@echo off
for /l %%f in (1000001,1,1000100) do (
    setlocal enabledelayedexpansion
    set p=%%f
       gawk "{for(i=1;i<=NF;i++){if(!a[$i]++)b[++j]=$i;if(0+N<a[$i])N=a[$i]}}END{for(k=1;k<=j;k++)c[a[b[k]]]=c[a[b[k]]]b[k]\" \";s=asorti(c,tA);for(i=s;i>0;i--)print c[tA]}" d:\!p:~1!\!p:~1!.txt > e:\!p:~1!\!p:~1!.txt
    endlocal
)
exit

TOP

回复 12# 77七

谢谢!在gawk命令中的 ”!“ 前加个 “^” 转义

TOP

返回列表