找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 73664|回复: 21

[文本处理] 求助改进循环将一个文本的每一行重复指定次数后按每隔指定行数插入到另一个文本

[复制链接]
发表于 2015-4-18 15:48:40 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-8-9 18:18 编辑

我有一个bat,但是处理时间太长了,如何让这个bat处理速度变快
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p file=拖入需要修改的文件并回车:
  3. set/p src=拖入需要增加的文件并回车:
  4. set/p count=输入每隔多少行插入:
  5. set/p blank=输入插入多少行:
  6. for /f "delims=" %%i in ('type %src%')do set/ai+=1&set "#!i!=%%i"
  7. (for /f "usebackq delims=" %%a in (%file%) do (
  8.   echo,%%a
  9.   set/a n+=1,m=n%%count
  10.   if !m! equ 0 set/aj+=1&for /l %%b in (1 1 %blank%)do for %%i in (!j!)do echo,!#%%i!
  11.   if !j! equ !i! set j=0
  12. ))>new.txt
  13. start new.txt
复制代码
这个bat数据处理速度太慢了,请教一下大神怎么样才能变成快速?
发表于 2015-4-18 15:50:27 | 显示全部楼层
本帖最后由 BAT1 于 2015-4-18 15:52 编辑

文件有多大?搞个样本试试.
 楼主| 发表于 2015-4-18 15:52:24 | 显示全部楼层
这个是插入数据
这个是源文件
都是随便写的,测试用
 楼主| 发表于 2015-4-18 16:13:04 | 显示全部楼层
回复 2# BAT1


看楼上。。
 楼主| 发表于 2015-4-20 13:49:59 | 显示全部楼层
求帮忙。
发表于 2015-4-20 13:58:59 | 显示全部楼层
回复 3# q4911


    真实的“原文件.txt”和“插入数据.txt”分别有多大?使用顶楼的代码处理需要多长时间?
 楼主| 发表于 2015-4-21 13:53:30 | 显示全部楼层
回复 6# gawk


   真实原文件大概是10~20MB,插入数据大概是几十KB。
  因为上传文件不能提交超过一定MB的文件,只要把源文件的内容随便一直往下复制到一定大小就可以测试了。插入数据也可以随便写。
  之前我的处理时间至少要十分钟吧。
发表于 2015-4-21 15:08:43 | 显示全部楼层
回复 7# q4911


    传到百度网盘吧
发表于 2015-4-21 19:23:31 | 显示全部楼层
纯批来处理这么大文件,不死机算好了。。。
 楼主| 发表于 2015-4-28 14:17:49 | 显示全部楼层
回复 8# gawk


测试的文本我上传到百度网盘了 http://pan.baidu.com/s/1eQ90DPK
发表于 2015-4-28 15:52:34 | 显示全部楼层
本帖最后由 CrLf 于 2015-4-28 16:24 编辑

这么大的变量表,读写起来非常慢的
尤其是你的代码中以 # 开头的一大坨变量在变量表中太靠前,严重影响 j、n 等高频变量的引用耗时,简单的办法是把 # 改成 x、y、z 之类比较靠后的变量,并在引用之后立即把没用的变量删除,就会快多了
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p file=拖入需要修改的文件并回车:
  3. set/p src=拖入需要增加的文件并回车:
  4. set/p count=输入每隔多少行插入:
  5. set/p blank=输入插入多少行:

  6. for /f "delims=" %%i in ('type %src%')do set/ai+=1&set "z!i!=%%i"

  7. set "n=%count%"

  8. (for /f "usebackq delims=" %%a in ("%file:"=%") do (
  9.   echo,%%a
  10.   set/a n-=1

  11.   if !n! leq 0 (
  12.     for %%i in (!j!)do set "str=!#%%i!"&set "#%%i="
  13.     for /l %%b in (1 1 %blank%)do echo !str!
  14.     set "n=%count%"
  15.   )

  16. ))>new.txt

  17. start new.txt
复制代码
 楼主| 发表于 2015-4-28 16:36:10 | 显示全部楼层
回复 11# CrLf


  如何通过  gawk 或者 sed 来加速处理bat呢?
发表于 2015-4-28 16:40:51 | 显示全部楼层
本帖最后由 CrLf 于 2015-4-28 16:44 编辑

这样可能更好,避开大坨变量:
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p file=拖入需要修改的文件并回车:
  3. set/p src=拖入需要增加的文件并回车:
  4. set/p count=输入每隔多少行插入:
  5. set/p blank=输入插入多少行:

  6. set "n=%count%"

  7. (for /f "usebackq delims=" %%a in ("%file:"=%") do (
  8.   echo,%%a
  9.   set/a n-=1

  10.   if !n! leq 0 (
  11.     set "str="
  12.     set /p "str="
  13.     for /l %%b in (1 1 %blank%)do echo !str!
  14.     set "n=%count%"
  15.   )
  16. ))>new.txt <%src%

  17. start new.txt
复制代码
发表于 2015-4-28 17:37:53 | 显示全部楼层
实测13楼方案隔2行插入2次耗时如下:
  1. start at 16:43:49.16
  2. end at 16:47:12.32
复制代码
合计约3分半钟

同样设置下,顶楼方案的日志:
  1. start at 16:50:16.46
复制代码
截至发此帖时(17:35)仍在运行...

提升后的效率应该达到楼主的要求吧

评分

参与人数 1技术 +1 收起 理由
q4911 + 1 问题解决了

查看全部评分

 楼主| 发表于 2015-4-28 17:48:08 | 显示全部楼层
回复 14# CrLf


    确实快了 很多 谢谢大神
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 07:52 , Processed in 0.035260 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表