Board logo

标题: [文本处理] 【已解决】批处理如何按指定行的数量复制该行文本? [打印本页]

作者: rockjean    时间: 2019-3-22 18:05     标题: 【已解决】批处理如何按指定行的数量复制该行文本?

本帖最后由 rockjean 于 2019-3-23 18:17 编辑

有如下格式的文本行:
01 name color size description qts
02 jerry  red  S  small 560
03 jack yellow M medium 780
04 rose black L large 660
... ...
请问怎么按照以下要求生成新的文本:
按照02行的数量560,复制该行“02”到“small”之间的内容生成560行相同的数据,
然后按03行的数量780,复制该行“03”到“medium”之间的内容生成780行相同的数据,
以此类推,直至最后行的数据复制完成,生成新的文本。
作者: rockjean    时间: 2019-3-22 18:07

最好是用批处理命令解决,然后能否加个完成这些内容所用的时间。
作者: rockjean    时间: 2019-3-22 18:11

再做成后台处理
作者: xczxczxcz    时间: 2019-3-22 19:32

powershell   start-job 了解一下
作者: Batcher    时间: 2019-3-22 19:48

  1. @echo off
  2. (for /f "skip=1 tokens=1-6" %%a in ('type "1.txt"') do (
  3.     for /l %%i in (1,1,%%f) do (
  4.         echo %%a %%b %%c %%d %%e
  5.     )
  6. ))>"2.txt"
复制代码

作者: rockjean    时间: 2019-3-23 08:51

回复 4# xczxczxcz


    不会powershell
作者: rockjean    时间: 2019-3-23 08:52

回复 5# Batcher


    看着好精简的样子,我去试试看,谢谢你啦~
作者: rockjean    时间: 2019-3-23 09:11

回复 1# rockjean


    现在又出现新的需求,每行复制指定量之后,需要插入相同数量的空白行。
比如第2行复制完成560次之后插入10条空白行,然后接着复制第3行数据,复制完后也插入10条空白行,接着进行第4行的复制...
作者: Batcher    时间: 2019-3-23 09:44

回复 8# rockjean
  1. @echo off
  2. (for /f "skip=1 tokens=1-6" %%a in ('type "1.txt"') do (
  3.     for /l %%i in (1,1,%%f) do (
  4.         echo %%a %%b %%c %%d %%e
  5.     )
  6.     for /l %%i in (1,1,10) do (
  7.         echo,
  8.     )
  9. ))>"2.txt"
复制代码

作者: rockjean    时间: 2019-3-23 11:52

回复 9# Batcher


    先点个赞!大神的代码果然精简,无比佩服。换个思路,先提取数量再进行循环,效果果然更不一样。
下面是我写的代码,是先提取循环参数,再进行提取文本,就显得比较繁锁了:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::后台运行
  4. if "%1" == "h" goto showtime
  5. mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit
  6. ::设置开始时间
  7. :showtime
  8. set t1=%time:~0,8% & echo 开始时间:!t1!>report.txt
  9. for /f "tokens=1-3 delims=:" %%r in ( 'echo !t1!' ) do (
  10.     set /a h1=1%%r-100
  11.     set /a m1=1%%s-100
  12.     set /a s1=1%%t-100
  13. )
  14. ::每行生成单独文件
  15. :divide
  16. ::提取第一列的序号作为文件名并生成临时文件
  17. for /f "skip=1 tokens=1,* delims= " %%i in (data.txt) do (
  18. echo %%i %%j>>%%i.tmp
  19. set total=%%i
  20. )
  21. set n=1
  22. ::重新生成数据
  23. :reborn
  24. if %n% gtr !total! goto end
  25. ::提取最后一列的数据为变量
  26. for /f "tokens=8 delims= " %%1 in (%n%.tmp) do (
  27. set var=%%1
  28. )
  29. for /l %%a in (1 1 !var!) do (
  30. ::提取需要的列数据生成新文件
  31. for /f "tokens=2-7 delims= " %%I in (%n%.tmp) do (
  32. echo %%J %%K %%L %%M %%N %%O>>New.txt
  33. )
  34. )
  35. ::按实际一个空白模版需要的模数生成空白行
  36. for /l %%z in (1,1,10) do echo=>>New.txt
  37. set /a n+=1
  38. goto reborn
  39. :end
  40. del *.tmp
  41. ::设置结束时间
  42. set t2=%time:~0,8% & echo 结束时间:!t2!>>report.txt
  43. for /f "tokens=1-3 delims=:" %%R in ( 'echo !t2!' ) do (
  44.     set /a h2=1%%R-100
  45.     set /a m2=1%%S-100
  46.     set /a s2=1%%T-100
  47. )
  48. ::计算时间差
  49. set /a t3=(%h2%*3600+%m2%*60+%s2%)-(%h1%*3600+%m1%*60+%s1%)
  50. set /a m3=%t3%/60 & set /a s3=%t3%%%60
  51. echo 总共用时:%m3%分%s3%秒>>report.txt
  52. echo 数据包制作完成~>>report.txt
  53. timeout /T 2 /nobreak
  54. msg * <report.txt
  55. exit
复制代码

作者: rockjean    时间: 2019-3-23 17:02

本帖最后由 rockjean 于 2019-3-23 17:04 编辑

回复 9# Batcher


    大神,刚才我用您的代码试验了一下,结果不行呢?
代码虽然精简,但是生成的文件一直在增大,几十M往上了去,
强制^c都停不了,里面都是第一条文本,没有满足需求。
作者: Batcher    时间: 2019-3-23 17:31

回复 11# rockjean


    把你测试用的bat和txt打包压缩传上来我试试
作者: rockjean    时间: 2019-3-23 18:02

回复 12# Batcher


刚才有空又debug了一下,发现是tokens的问题,
我的数据里面有7列,把“1-6”改成“1-7”,后面的"%%f"往后推就行。
运行一下,完美!
再次感谢大神!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2