Board logo

标题: [文本处理] 批处理怎样把3个文本合并一个文本,类似数据库的join [打印本页]

作者: juan1923    时间: 2022-9-5 22:58     标题: 批处理怎样把3个文本合并一个文本,类似数据库的join

请社区的大佬用批处理实现以下文本合并的效果,感激不尽
下面的空格看起来乱,其实我是用的tab 分隔,为了方便合并文本后,直接贴入excel
我现在有3个文本,文本内容如下:

文本1(固定2行)

字段1        字段2
a1        a2


文本2(行数不确定,最少的话是只有字段那一行,也有可能上百行)

字段3        字段4        字段5        字段6        字段7        字段8
b1        b2        b3        b4        b5        b6
b11        b21        b31        b41        b51        b61
b12        b22        b32        b42        b52        b62
b13        b23        b33        b43        b53        b63
b14        b24        b34        b44        b54        b64
b15        b25        b35        b45        b55        b65
b16        b26        b36        b46        b56        b66
b17        b27        b37        b47        b57        b67
....
....
行数不定
....
....


文本3(行数不确定,最少的话是只有字段那一行,也有可能上百行)
字段9        字段10        字段11        字段12字段13        字段14
c1        c2        c3        c4        c5        c6
c11        c21        c31        c41        c51        c61
c12        c22        c32        c42        c52        c62
c13        c23        c33        c43        c53        c63
c14        c24        c34        c44        c54        c64
....
....
行数不定
....
....


合并效果(就是每个文本靠右按列黏贴的效果。):
字段1        字段2        字段3        字段4        字段5        字段6        字段7        字段8        字段9        字段10        字段11        字段12字段13        字段14                               
a1        a2        b1        b2        b3        b4        b5        b6        c1        c2        c3        c4        c5        c6
                b11        b21        b31        b41        b51        b61        c11        c21        c31        c41        c51        c61
                b12        b22        b32        b42        b52        b62        c12        c22        c32        c42        c52        c62
                b13        b23        b33        b43        b53        b63        c13        c23        c33        c43        c53        c63
                b14        b24        b34        b44        b54        b64        c14        c24        c34        c44        c54        c64
                b15        b25        b35        b45        b55        b65        ....                                       
                b16        b26        b36        b46        b56        b66        ....                                       
                b17        b27        b37        b47        b57        b67        行数不定                                       
                ....                                                ....                                       
                ....                                                ....                                       
                行数不定                                                                                       
                ....                                                                                       
                ....
作者: idwma    时间: 2022-9-7 16:45

  1. #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
  2. dir *.txt|%{$a+=,(gc $_)}
  3. $n=($a|%{$_.count}|measure -max).maximum
  4. $a|%{
  5.     $f=++$i-1
  6.     $l=$_[0].length-1
  7.     $s=(0..$l|%{' '}) -join ''
  8.     if($n -ne $_.count){0..($n-$_.count-1)|%{$a[$f]+=,$s}}
  9. }
  10. rv i
  11. $b=($a|%{'$a[{0}][$i-1]' -f [int]$i++}) -join '+"`t"+'
  12. $c=$i-1
  13. rv i
  14. $e=while($d -notmatch "^\t{$c}$" ){
  15.     $i++
  16.     $d=iex $b
  17.     $d
  18. }
  19. sc tmp.txt $e
复制代码

作者: qixiaobin0715    时间: 2022-9-8 08:55

用纯批应当也可,文本文件及批处理均保存为ANSI编码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set n=0
  4. for %%I in (1.txt 2.txt 3.txt) do (
  5. for /f "tokens=2 delims=:" %%i in ('find /v /c "" %%I') do (
  6.     if %%i gtr !n! set n=%%i
  7. )
  8. )
  9. (for /l %%i in (1,1,%n%) do (
  10.     set /p str1=
  11.     if !str1! neq !str2! (
  12.         echo,!str1!
  13.     ) else (
  14.         echo,
  15.     )
  16.     set str2=!str1!
  17. ))<1.txt>1.log
  18. (for /f "delims=" %%i in (1.log) do (
  19.     set /p str1=
  20.     if !str1! neq !str2! (
  21.         echo,%%i !str1!
  22.     ) else (
  23.         echo,%%i
  24.     )
  25.         set str2=!str1!
  26. ))<2.txt>2.log
  27. (for /f "delims=" %%i in (2.log) do (
  28.     set /p str1=
  29.     if !str1! neq !str2! (
  30.         echo,%%i !str1!
  31.     ) else (
  32.         echo,%%i
  33.     )
  34.     set str2=!str1!
  35. ))<3.txt>1.log
  36. del 2.log
  37. pause
复制代码
代码未经测试。
作者: juan1923    时间: 2022-9-9 22:12

回复 2# idwma


    谢谢。
刚测试了,合并后第一个文本第三行不是2个tab 空格,所以直接第二个文本的第一个字段跑到第一个文本的的第二个字段了
作者: juan1923    时间: 2022-9-10 00:19

根据2位的思路,自己写了一段
  1. $a = gc .\1.txt
  2. $b = gc .\2.txt
  3. $c = gc .\3.txt
  4. if ( Test-Path .\12.txt ) {Remove-Item -Force .\12.txt}
  5. if ( Test-Path .\22.txt ) {Remove-Item -Force .\22.txt}
  6. $a_c = $a.Count-1
  7. $b_c = $b.Count-1
  8. $c_c = $c.Count-1
  9. $Tab = [char]9
  10. if ( $a_c -ge $b_c )
  11. {
  12. $num = $a_c
  13. for($i=0;$i -le $num;$i+=1)
  14.    {
  15.      if ( $i -le $b_c) {
  16.                         $a[$i] + $Tab + $Tab + $b[$i] | Out-File 12.txt -Append
  17.                         }
  18.      else
  19.     {
  20.        Write-Output "$a[$i] + $Tab + $Tab" | Out-File 12.txt -Append
  21.     }
  22.     }
  23. } else
  24. {
  25. $num = $b_c
  26. for($i=0;$i -le $num;$i+=1)
  27.   {
  28.      if ( $i -le $b_c) {
  29.        $a[$i] + $Tab +  $Tab + $b[$i] | Out-File 12.txt -Append
  30.     }
  31.      else
  32.     {
  33.        $Tab + $Tab + $b[$i] | Out-File 12.txt -Append
  34.     }
  35.    }
  36. }
  37. $d = gc .\12.txt
  38. $d_c = $d.Count-1
  39. if ( $d_c  -ge $num )
  40. {
  41. $num = $d_c
  42. for($i=0;$i -le $num;$i+=1)
  43.    {
  44.      if ( $i -le $c_c) {
  45.                         $d[$i] + $Tab + $Tab + $c[$i] | Out-File 22.txt -Append
  46.                         }
  47.      else
  48.     {
  49.        Write-Output "$d[$i] + $Tab + $Tab" | Out-File 22.txt -Append
  50.     }
  51.     }
  52. } else
  53. {
  54. $num = $c_c
  55. for($i=0;$i -le $num;$i+=1)
  56.   {
  57.      if ( $i -le $c_c) {
  58.        $d[$i] + $Tab +  $Tab + $c[$i] | Out-File 22.txt -Append
  59.     }
  60.      else
  61.     {
  62.        $Tab + $Tab + $c[$i] | Out-File 22.txt -Append
  63.     }
  64.    }
  65. }
  66. if ( Test-Path .\12.txt ) {Remove-Item -Force .\12.txt}
复制代码

作者: idwma    时间: 2022-9-10 00:35

稍稍改一下
  1. #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
  2. dir *.txt|%{$a+=,(gc $_)}
  3. $n=($a|%{$_.count}|measure -max).maximum
  4. $a|%{
  5.     $f=++$i-1
  6.     $l=[regex]::matches($_[0],'\t').count-1
  7.     $s=(0..$l|%{"`t"}) -join ''
  8.     if($n -ne $_.count){0..($n-$_.count-1)|%{$a[$f]+=,$s}}
  9. }
  10. rv i
  11. $b=($a|%{'$a[{0}][$i-1]' -f [int]$i++}) -join '+"`t"+'
  12. $c=$i-1
  13. rv i
  14. $e=while($d -notmatch "^\t{$c}$" ){
  15.     $i++
  16.     $d=iex $b
  17.     $d
  18. }
  19. sc tmp.txt $e
复制代码





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