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

[文本处理] 请教两个文本合拼 实现结果文本交替内容效果批处理

请教  文本A内容如图
文本B内容如图
请问如何利用批处理  实现 A与B文本合拼后  实现最终文本 奇数行是原A文本内容  偶数行原B文本内容呢

  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in (a.txt) do (
  3.     set /p b=
  4.     echo %%a
  5.     echo !b!
  6. ))<b.txt>c.txt
复制代码
1

评分人数

TOP

如果两个文件文本行数不相等,不会产生新的数据
  1. @Powershell "& {[ScriptBlock]::Create("'#' + (gc '%~f0' -raw)").Invoke()}" & pause & goto :eof
  2. $file1 =  ([System.IO.FileInfo]".\a.txt").OpenText()
  3. $file2 =  ([System.IO.FileInfo]".\b.txt").OpenText()
  4. while(($file1.Peek() -ne -1) -or ($file2.Peek() -ne -1)){
  5. if($file1.Peek() -ne -1){Add-Content -Value $file1.ReadLine() -Path .\c.txt}
  6. if($file2.Peek() -ne -1){Add-Content -Value $file2.ReadLine() -Path .\c.txt }
  7. }
  8. $file1.Close();$file2.Close()
复制代码
1

评分人数

    • yhcfsr: 学到新的bat+powershell方法技术 + 1
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

本帖最后由 yhcfsr 于 2019-3-9 18:30 编辑

楼上代码高大上,我来一个笨拙的
  1. @Powershell "& {[ScriptBlock]::Create("'#' + (gc '%~f0' -raw)").Invoke()}" & pause & goto :eof
  2. $text_A = type a.txt -ReadCount 0;
  3. $text_B = type b.txt -ReadCount 0;
  4. $count_a, $count_b = $text_A.Count, $text_B.Count;
  5. $count = $count_a + $count_b;
  6. [System.Collections.ArrayList] $result = @();
  7. $counter_a, $counter_b = 0, 0;
  8. for($i=0;$i -lt $count;$i++)
  9. {
  10.     #如果A文本读完,只处理B
  11.     if($counter_a -eq $count_a) { [void] $result.Add($text_B[$counter_B++]); }
  12.     #如果B文本读完,只处理A
  13.     elseif($counter_b -eq $count_b) { [void] $result.Add($text_A[$counter_a++]); }
  14.     #如果A,B都未完,下标为偶数时,加入A元素;下标为奇数时,加入B元素
  15.     else {
  16.         if($i%2 -eq 0) {[void] $result.Add($text_A[$counter_a++]); }
  17.         else {[void] $result.Add($text_B[$counter_b++]); }  
  18.     }
  19. }
  20. #输出结果
  21. [io.file]::WriteAllLines('结果.txt',$result,[text.encoding]::Default);
复制代码
1

评分人数

    • ivor: 乐于助人技术 + 1
QQ 33892006

TOP

多谢 各位大侠指教

TOP

回复 3# ivor 好  请问运行提示无效数据 是什么原因呢

TOP

回复 4# yhcfsr 请教 出错原因

TOP

  1. use File::Slurp;
  2. use List::MoreUtils qw/pairwise/;
  3. my @a = grep { chomp } read_file("a.txt");
  4. my @b = grep { chomp } read_file("b.txt");
  5. my @c = pairwise { $a, $b } @a, @b;
  6. grep { printf "%2d %s\n", $_+1, $c[$_]  } 0..$#c;
复制代码
B文本偶数行,含行号
  1. 1 A
  2. 2 B
  3. 3 A1
  4. 4 B1
  5. 5 A2
  6. 6 B2
  7. 7
  8. 8 B3
  9. 9
  10. 10 B4
复制代码

TOP

这玩意有必要那么复杂吗? 简单就好。
  1. $a = gc a.txt -Readcount 0; $b = gc b.txt -Readcount 0;
  2. $arr = @(); $count = $a.count;
  3. if ( $b.count -gt $a.count ) { $count = $b.count };
  4. for ( $i=0; $i -lt $count; $i++ ) { $arr += $a[$i]; $arr += $b[$i] };
  5. $arr>c.log;
复制代码

TOP

回复 7# hqhlwz

他们用的是对象的属性方法,要求两边的数据对齐才行。换成对象的方法(method)就可以了。

TOP

这个问题在此帖中讨论过
可以用busybox
  1. busybox paste -d\n a.txt b.txt
复制代码
1

评分人数

TOP

本帖最后由 523066680 于 2019-3-21 18:27 编辑

回复 11# tigerpower

    在 MSYS 2 和 BusyBox 分别试了一下,行为不一样
msys的 paste 会把B的内容固定在偶数行(会预留间隔空行),busybox 的 paste 将不会预留那些间隔。

TOP

  1. gawk "{if(FNR==NR)a[2*FNR-1]=$0;else a[2*FNR]=$0}END{for(i=1;i<=length(a);i++)print a[i]}" a.txt b.txt > c.txt
复制代码
  1. gawk "{a[FNR]=$0\"\n\"a[FNR]}END{for(i=1;i<=length(a);i++)printf a[i]}" b.txt a.txt
复制代码

TOP

回复 7# hqhlwz


    我测试没问题,把bat与a.txt,b.txt放一起测试.
如果你本身就是这样做才出的问题,那应该可能是系统版本原因,因为脚本第一句原因,需要powershell 5.0,也就是说需要WIN10系统
QQ 33892006

TOP

返回列表