标题: [文本处理] 【已解决】批处理如何按指定行的数量复制该行文本? [打印本页]
作者: 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
- @echo off
- (for /f "skip=1 tokens=1-6" %%a in ('type "1.txt"') do (
- for /l %%i in (1,1,%%f) do (
- echo %%a %%b %%c %%d %%e
- )
- ))>"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 - @echo off
- (for /f "skip=1 tokens=1-6" %%a in ('type "1.txt"') do (
- for /l %%i in (1,1,%%f) do (
- echo %%a %%b %%c %%d %%e
- )
- for /l %%i in (1,1,10) do (
- echo,
- )
- ))>"2.txt"
复制代码
作者: rockjean 时间: 2019-3-23 11:52
回复 9# Batcher
先点个赞!大神的代码果然精简,无比佩服。换个思路,先提取数量再进行循环,效果果然更不一样。
下面是我写的代码,是先提取循环参数,再进行提取文本,就显得比较繁锁了:- @echo off
- setlocal enabledelayedexpansion
-
- ::后台运行
- if "%1" == "h" goto showtime
- mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit
-
- ::设置开始时间
- :showtime
- set t1=%time:~0,8% & echo 开始时间:!t1!>report.txt
- for /f "tokens=1-3 delims=:" %%r in ( 'echo !t1!' ) do (
- set /a h1=1%%r-100
- set /a m1=1%%s-100
- set /a s1=1%%t-100
- )
-
- ::每行生成单独文件
- :divide
- ::提取第一列的序号作为文件名并生成临时文件
- for /f "skip=1 tokens=1,* delims= " %%i in (data.txt) do (
- echo %%i %%j>>%%i.tmp
- set total=%%i
- )
- set n=1
-
- ::重新生成数据
- :reborn
- if %n% gtr !total! goto end
- ::提取最后一列的数据为变量
- for /f "tokens=8 delims= " %%1 in (%n%.tmp) do (
- set var=%%1
- )
- for /l %%a in (1 1 !var!) do (
- ::提取需要的列数据生成新文件
- for /f "tokens=2-7 delims= " %%I in (%n%.tmp) do (
- echo %%J %%K %%L %%M %%N %%O>>New.txt
- )
- )
- ::按实际一个空白模版需要的模数生成空白行
- for /l %%z in (1,1,10) do echo=>>New.txt
- set /a n+=1
- goto reborn
- :end
- del *.tmp
-
- ::设置结束时间
- set t2=%time:~0,8% & echo 结束时间:!t2!>>report.txt
- for /f "tokens=1-3 delims=:" %%R in ( 'echo !t2!' ) do (
- set /a h2=1%%R-100
- set /a m2=1%%S-100
- set /a s2=1%%T-100
- )
-
- ::计算时间差
- set /a t3=(%h2%*3600+%m2%*60+%s2%)-(%h1%*3600+%m1%*60+%s1%)
- set /a m3=%t3%/60 & set /a s3=%t3%%%60
- echo 总共用时:%m3%分%s3%秒>>report.txt
- echo 数据包制作完成~>>report.txt
- timeout /T 2 /nobreak
- msg * <report.txt
- 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://www.bathome.net/) |
Powered by Discuz! 7.2 |