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


    不是熟不熟的问题, 纯PS 体质上 就比 PY 快些,都是脚本语言,PY 就是少打点字,少些括号,被国内媒体炒做太夸张。不如多点时间去学习 汇编/C系列/JAVA/Delphi等。
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

回复 16# xczxczxcz


    或许吧!!!我喜欢Python,就像喜欢C一样!

TOP

回复 8# xczxczxcz


    你好,我文本的原始数据,各用户的行数是一致的

TOP

回复 7# went


    如果我有20行用户名呢,用你这个就不行了吧

TOP

回复 6# flashercs


    如果所有的用户用户名有30行,该怎么写

TOP

回复 5# xczxczxcz


    你的思路是对的,他们写的,没有考虑到我如果同一个用户名有30行,就无法实现

TOP

批处理如何对指定行数的文本进行分割排列

原始文本 1.txt
  1. 1005495524----a111111
  2. 1005495524----abc123
  3. 1005495524----aini1314
  4. 1005495524----iloveyou
  5. 1005495524----q1w2e3r4
  6. 1005495524----qq123123
  7. 1044122462aa----a111111
  8. 1044122462aa----abc123
  9. 1044122462aa----aini1314
  10. 1044122462aa----iloveyou
  11. 1044122462aa----q1w2e3r4
  12. 1044122462aa----qq123123
  13. 1095591332aa----a111111
  14. 1095591332aa----abc123
  15. 1095591332aa----aini1314
  16. 1095591332aa----iloveyou
  17. 1095591332aa----q1w2e3r4
  18. 1095591332aa----qq123123
  19. 1111qqqq1111----a111111
  20. 1111qqqq1111----abc123
  21. 1111qqqq1111----aini1314
  22. 1111qqqq1111----iloveyou
  23. 1111qqqq1111----q1w2e3r4
  24. 1111qqqq1111----qq123123
  25. 111qqq111----a111111
  26. 111qqq111----abc123
  27. 111qqq111----aini1314
  28. 111qqq111----iloveyou
  29. 111qqq111----q1w2e3r4
  30. 111qqq111----qq123123
复制代码
处理后的文本2.txt
  1. 1005495524----aini1314
  2. 1005495524----a111111
  3. 1005495524----abc123
  4. 1044122462aa----aini1314
  5. 1044122462aa----a111111
  6. 1044122462aa----abc123
  7. 1095591332aa----aini1314
  8. 1095591332aa----a111111
  9. 1095591332aa----abc123
  10. 1111qqqq1111----aini1314
  11. 1111qqqq1111----a111111
  12. 1111qqqq1111----abc123
  13. 111qqq111----aini1314
  14. 111qqq111----a111111
  15. 111qqq111----abc123
  16. 1005495524----q1w2e3r4
  17. 1005495524----iloveyou
  18. 1005495524----qq123123
  19. 1044122462aa----q1w2e3r4
  20. 1044122462aa----iloveyou
  21. 1044122462aa----qq123123
  22. 1095591332aa----q1w2e3r4
  23. 1095591332aa----iloveyou
  24. 1095591332aa----qq123123
  25. 1111qqqq1111----q1w2e3r4
  26. 1111qqqq1111----iloveyou
  27. 1111qqqq1111----qq123123
  28. 111qqq111----q1w2e3r4
  29. 111qqq111----iloveyou
  30. 111qqq111----qq123123
复制代码
想将相同的内容用户名,以每3行为基础进行分割,排列,实现2.txt的效果

附上原始文本,80万条,不知道批处理可否实现

链接:https://share.weiyun.com/KY7VFOde 密码:i4aayw

TOP

纯P, 估计累的够呛,这种文本需求,建议还是用其它语言来处理,如PS,python,perl,awk.
我个人现在还是更喜欢awk来处理文本。
简单起见,假定你的源文件,都是这样规则的,用户都已经分组好了,用户条数都是一致的。

test.awk
  1. function ceil(a,b)
  2. {
  3.     t=int(a/b)
  4.     return a==t*b?t:t+1
  5. }
  6. BEGIN {
  7.     usrLines=44
  8.     n=3
  9. }
  10. {
  11.     a[int((NR-1)/usrLines)][(NR-1)%usrLines]=$0
  12. }
  13. END {
  14.     for(k=0;k<ceil(usrLines,n);k++)
  15.         for(i=0;i<length(a);i++)
  16.             for(j=0+n*k;j<n+n*k && j<usrLines;j++)
  17.                 print a[i][j]
  18. }
复制代码
  1. awk -f test.awk 3.txt >2.txt
复制代码
几十万条结果还是秒出的。

TOP

本帖最后由 Rasm 于 2020-5-29 19:49 编辑

回复 23# cfwyy77_bat


为什么处理以后,有些是 4行,有些6行

附上原始文本,80万条

链接:https://share.weiyun.com/KY7VFOde 密码:i4aayw

TOP

本帖最后由 WHY 于 2020-6-12 16:38 编辑
  1. $d = get-Date;
  2. $arr = [IO.File]::ReadAllLines('3.txt', [Text.Encoding]::UTF8) -match '-{4}';
  3. $Len = $arr.Count;
  4. $dic = New-Object 'System.Collections.Generic.Dictionary[string, [Collections.ArrayList]]';
  5. $max = 0;
  6. for($i=0; $i -lt $Len; $i++) {
  7.     $a = $arr[$i].Trim() -split('----');
  8.     if( !$dic.ContainsKey($a[0]) ){
  9.         $dic.Add($a[0], @($a[1]));    #用户名加入到字典,密码加入到数组
  10.     } else {
  11.         [void]$dic[$a[0]].Add($a[1]);
  12.     }
  13. }
  14. forEach($key In $dic.Keys) {         #找长度最大的数组
  15.     if($dic[$key].Count -gt $max){ $max = $dic[$key].Count; }
  16. }
  17. $out = for($i=0; $i -lt $max; $i+=3) {
  18.     forEach($key In $dic.Keys) {
  19.         for($j=0; $j -lt 3; $j++) {
  20.             if($dic[$key].Count -gt $i+$j) {
  21.                 $key + '----' + $dic[$key][$i+$j];
  22.             } else { break; }
  23.         }
  24.     }
  25. }
  26. [IO.File]::WriteAllLines('22.txt', $out);
  27. ((get-Date) - $d).TotalSeconds
  28. pause
复制代码
2.6404314
按 Enter 键继续...:
563024 行,速度不算快,也不算太慢
  1. @echo off
  2. chcp 65001 > nul
  3. gawk -F"-{3,}" "BEGIN{max=0}{if($1!=s){i++;j=1};a[i][j++]=$0;s=$1;if(j>max)max=j}END{for(n=1;n<max;n+=3)for(i in a)for(j=0;j<3;j++)if(a[i][n+j])print a[i][n+j]}" 3.txt > 22.txt
  4. pause
复制代码
1

评分人数

TOP

返回列表