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

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

本帖最后由 Rasm 于 2020-5-25 23:01 编辑

原始文本 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
复制代码
想将相同的内容,以每3行为基础进行分割,排列,实现以后的效果

处理后的文本  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
复制代码

没看出你是怎么个排列法

TOP

回复 2# went


    就是 同一个用户名,以3行为分界线

TOP

本帖最后由 smss 于 2020-5-26 09:33 编辑
  1. @echo off&setlocal EnableDelayedExpansion
  2. for /f "delims=" %%a in ('dir/b/s *.txt') do (set /a m=0,n=0
  3. for /f "usebackq delims=" %%i in ("%%a") do (set /a n=n%%3+1,m+=1
  4. if !m! equ 1 (>"%%a" echo %%i) else (>>"%%a" echo %%i
  5. if !n! equ 3 echo -------------------------我是分割线------------------------->>"%%a"
  6. )))
  7. echo 处理完毕
  8. pause
复制代码
1

评分人数

    • Rasm: 不是这样子的效果哦技术 + 1

TOP

回复 4# smss


    你这个和一楼的结果是不一样的< 应该是把所有的用户数读3行,输出,再读所有用户的另外3行,再。。。
1

评分人数

    • Rasm: 感谢支持技术 + 1
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

  1. @echo off
  2. cd /d "%~dp0"
  3. set "srcfile=1.txt"
  4. set "dstfile=2.txt"
  5. set "tmpfile1=%temp%\~a.tmp"
  6. set "tmpfile2=%temp%\~b.tmp"
  7. cd .>"%tmpfile1%"
  8. cd .>"%tmpfile2%"
  9. setlocal EnableDelayedExpansion
  10. set tmpflag=0
  11. set line=0
  12. for /f "usebackq delims=" %%A in ("%srcfile%") do (
  13.   set /a line+=1
  14.   set str!line!=%%A
  15.   if !line! equ 3 (
  16.     if !tmpflag! equ 0 (
  17.       >>%tmpfile1% (echo,!str3!&echo,!str1!&echo,!str2!)
  18.       set tmpflag=1
  19.     ) else (
  20.       >>%tmpfile2% (echo,!str2!&echo,!str1!&echo,!str3!)
  21.       set tmpflag=0
  22.     )
  23.     set line=0
  24.   )
  25. )
  26. endlocal
  27. copy /y /b "%tmpfile1%"+"%tmpfile2%" "%dstfile%"
  28. del "%tmpfile1%"
  29. del "%tmpfile2%"
  30. pause
  31. exit /b
复制代码
1

评分人数

    • Rasm: 厉害。不过处理80行数据就不行了技术 + 1
微信:flashercs
QQ:49908356

TOP

6行数据为一组,输出顺序为3 1 2 5 4 6,应该就是这个规律
  1. @echo off
  2. set "num=0"
  3. for /f "delims=" %%i in (1.txt) do (
  4. set /a "num+=1"
  5. call set "line%%num%%=%%i"
  6. )
  7. (
  8. set /a a=3,b=1,c=2
  9. call :loop
  10. set /a a=5,b=4,c=6
  11. call :loop
  12. )>2.txt
  13. pause&exit
  14. :loop
  15. call echo %%line%a%%%
  16. call echo %%line%b%%%
  17. call echo %%line%c%%%
  18. set /a a+=6,b+=6,c+=6
  19. if %a% leq %num% goto :loop
复制代码

TOP

回复 7# went


    如果各用户的行数不一致,并不是所有的都6行的话,这个脚本输出不正确。
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

回复 6# flashercs


    发现 这个也是要求各用户数的行数要一致,否则输出不正确,某个用户数会连续超过3行。
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

本帖最后由 xczxczxcz 于 2020-5-26 13:15 编辑

bat 版 不按一楼的顺序  大文件不知内存会不会爆
  1. @echo off  & cd /d "%~dp0"
  2. SetLocal EnableDelayedExpansion
  3. for /f "delims=" %%a in ('type ".\1.txt"^|sort') do (
  4. for /f "tokens=1 delims=-" %%b in ("%%a") do (
  5. if not defined \%%b (
  6. set /a n=1, m=1
  7. set "\%%b=%%b"
  8. ) else (
  9. set /a n+=1, mod=!n! %% 3
  10. if !mod! equ 0 set /a m+=1
  11. )
  12. set "##!m!#%%a=%%a"
  13. )
  14. )
  15. (for /f "tokens=2 delims==" %%a in ('set ##') do echo %%a)>2.txt
复制代码
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

回复 8# xczxczxcz


主要就是楼主这个规律有点蛋疼
1

评分人数

    • Rasm: 简单说,就是用户名前三行往上排列,后面的 ...技术 + 1

TOP

powershell 版
  1. $g = (gc '.\1.txt') | Group { $_ -replace '-.*$' };
  2. $(for ($i = 0; $i -lt ($g | sort { $_.Count } | select -last 1).Count; $i += 3) {$g | % { $_.Group[$i..($i + 2)] }}) | sc '.\2.txt' -force;
复制代码
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

本帖最后由 Gin_Q 于 2020-5-26 14:35 编辑

我想Python的字典解决这个问题要简单很多!后面的排列好像需要是每个用户不能超过3行,不知道是需要满足多少行后可以再次重复第一次那个用户?(还是说把所有的满足3行的用户输出1遍(3行)(输出后销毁输出的3行),循环,)不满足条件后放到最后一起输出

TOP

回复 13# Gin_Q


    你写个 PY 的 我写个纯PS的,看 PS 快 还 PY 快。 都用字典写
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

回复 14# xczxczxcz


    朋友,我对Python不熟练,我写的代码没有意义的!

TOP

返回列表