标题: [文本处理] [已解决]批处理怎样把文档内容按顺序插入到另一文档里? [打印本页]
作者: weizhisheng 时间: 2019-1-7 13:33 标题: [已解决]批处理怎样把文档内容按顺序插入到另一文档里?
复制代码
作者: weizhisheng 时间: 2019-1-7 13:57
本帖最后由 weizhisheng 于 2019-1-7 14:03 编辑
《教程如图所示:》这个是固定的特征,在这个特征下面加,求大神帮忙。
作者: yhcfsr 时间: 2019-1-7 15:54
本帖最后由 yhcfsr 于 2019-1-7 23:50 编辑
脚本语言:BAT+Powershell 5.0
测试环境:WIN10
思路:在a.txt非空行与空行之间,依次取b.txt的两行插入- <# :********非修改区开始**********
- @echo off
- more +7 "%~f0" >"%~n0.ps1"
- powershell -Mta -NoLogo -NoProfile -ExecutionPolicy bypass -File "%~n0.ps1"
- del /f /q "%~n0.ps1"
- ********非修改区结束**********#>
-
- $contentA=[io.file]::ReadAllLines('D:\test\work\a.txt',[text.encoding]::Default);#读A文件
- $contentB=[io.file]::ReadAllLines('D:\test\work\b.txt',[text.encoding]::Default);#读B文件
-
- [System.Collections.ArrayList] $result=@();
- $sum=0;
- foreach($lineA in $contentA)
- {
- if($lineA){[void] $result.Add($lineA);$blank=$false;}
- else{
- if($contentB[$sum] -and !$blank){do{[void] $result.Add($contentB[$sum++]);}while($sum%2 -ne 0)}#出现空行时,插入b.txt两行
- [void] $result.Add($lineA);
- $blank=$true;
- }
- }
- if($lineA -and $contentB[$sum]){do{[void] $result.Add($contentB[$sum++]);}while($sum%2 -ne 0)}#a.txt结尾无空行时插入b.txt两行
- [io.file]::WriteAllLines('result.txt',$result,[text.encoding]::Default);#输出结果
- pause
复制代码
作者: WHY 时间: 2019-1-7 19:44
本帖最后由 WHY 于 2019-1-7 20:56 编辑
- @if(0)==(0) echo off
- cscript //nologo //e:jscript "%~f0" < b.txt
- pause & goto :EOF
- @end
-
- var arr = [], i = j = 0;
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- var str = fso.OpenTextFile('a.txt', 1).ReadAll();
-
- while(!WSH.StdIn.AtEndOfStream){
- var n = Math.floor( i++ / 4 );
- if(!arr[n]) arr[n] = [];
- arr[n].push( WSH.StdIn.ReadLine() );
- }
-
- str = str.replace(/^教程如图所示:(?=\r\n|$)/gm, function(s){if(arr[j]) s+='\r\n'+arr[j].join('\r\n'); j++; return s});
- WSH.Echo(str)
复制代码
作者: WHY 时间: 2019-1-7 19:51
- @echo off
- (for /f "delims=" %%i in ('findstr /n .* a.txt') do (
- set "str=%%i"
- setlocal enabledelayedexpansion
- set "str=!str:*:=!"
- echo;!str!
- if "!str!" == "教程如图所示:" (
- for /L %%j in (1 1 4) do (
- set "str=" & set /p "str="
- if not "!str!" == "" echo;!str!
- )
- )
- endlocal
- )) < b.txt
- pause
复制代码
作者: ivor 时间: 2019-1-7 20:00
本帖最后由 ivor 于 2019-1-7 20:49 编辑
两种方法:
第二个方法更简单一些,如果每次插入5行jpg就修改(($line += 2)-1)]} 为 (($line += 5)-1)]}
- $line = 0;gc a.txt | %{Write-Output $_; if ($_ -match "如图"){gc b.txt | select -Index $line,($line + 1); $line += 2;}} | Out-File c.txt
复制代码
- $line = 0;gc a.txt | %{Write-Output $_; if ($_ -match "如图"){(gc b.txt)[$line..(($line += 2)-1)]}} | Out-File c.txt
复制代码
作者: xczxczxcz 时间: 2019-1-8 08:12
简单方法
和 6 楼类似- $TextB=gc b.txt;$n=0;gc a.txt|%{if($_ -notmatch '^$'){$_;if($_ -match "如图"){$TextB[$n..$(($n+=4)-1)];''}}}|sc c.txt
复制代码
再来个二维数组的- Function Input { read-host "等量插入指定数量的图片:输入数字并回车" };$num=Input;
- While(!($num -as [int])){Cls; '输入错误,重新输入数字:';$num=Input};cls;
- $arr=$TextA=@();gc a.txt|%{if($_ -notmatch '^$'){$arr+=$_}else{if($arr){$TextA+=,$arr;$arr=@()}}};
- $TextB=gc b.txt;$n=0;$(for($i=0;$i -lt $TextA.count;$i++){$TextA[$i];$TextB[$n..$(($n+=$num)-1)];''})|sc c.txt;
复制代码
作者: WHY 时间: 2019-1-8 11:06
- gawk "1;/^教程如图所示:$/{for(i=0;i<4;i++){getline s<\"b.txt\";if(s){print s;s=\"\"}}}" a.txt > c.txt
复制代码
作者: weizhisheng 时间: 2019-1-8 21:14
回复 5# WHY
谢谢了,已解决。
作者: weizhisheng 时间: 2019-1-8 21:15
回复 6# ivor
谢谢了,已解决。
作者: weizhisheng 时间: 2019-1-8 21:15
回复 3# yhcfsr
谢谢了,已解决。
作者: weizhisheng 时间: 2019-1-8 21:16
回复 7# xczxczxcz
谢谢了,已解决。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |