标题: [文本处理] 批处理怎样把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
- #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
- dir *.txt|%{$a+=,(gc $_)}
- $n=($a|%{$_.count}|measure -max).maximum
- $a|%{
- $f=++$i-1
- $l=$_[0].length-1
- $s=(0..$l|%{' '}) -join ''
- if($n -ne $_.count){0..($n-$_.count-1)|%{$a[$f]+=,$s}}
- }
- rv i
- $b=($a|%{'$a[{0}][$i-1]' -f [int]$i++}) -join '+"`t"+'
- $c=$i-1
- rv i
- $e=while($d -notmatch "^\t{$c}$" ){
- $i++
- $d=iex $b
- $d
- }
- sc tmp.txt $e
复制代码
作者: qixiaobin0715 时间: 2022-9-8 08:55
用纯批应当也可,文本文件及批处理均保存为ANSI编码:- @echo off
- setlocal enabledelayedexpansion
- set n=0
- for %%I in (1.txt 2.txt 3.txt) do (
- for /f "tokens=2 delims=:" %%i in ('find /v /c "" %%I') do (
- if %%i gtr !n! set n=%%i
- )
- )
-
- (for /l %%i in (1,1,%n%) do (
- set /p str1=
- if !str1! neq !str2! (
- echo,!str1!
- ) else (
- echo,
- )
- set str2=!str1!
- ))<1.txt>1.log
-
- (for /f "delims=" %%i in (1.log) do (
- set /p str1=
- if !str1! neq !str2! (
- echo,%%i !str1!
- ) else (
- echo,%%i
- )
- set str2=!str1!
- ))<2.txt>2.log
-
- (for /f "delims=" %%i in (2.log) do (
- set /p str1=
- if !str1! neq !str2! (
- echo,%%i !str1!
- ) else (
- echo,%%i
- )
- set str2=!str1!
- ))<3.txt>1.log
- del 2.log
- pause
复制代码
代码未经测试。
作者: juan1923 时间: 2022-9-9 22:12
回复 2# idwma
谢谢。
刚测试了,合并后第一个文本第三行不是2个tab 空格,所以直接第二个文本的第一个字段跑到第一个文本的的第二个字段了
作者: juan1923 时间: 2022-9-10 00:19
根据2位的思路,自己写了一段- $a = gc .\1.txt
- $b = gc .\2.txt
- $c = gc .\3.txt
- if ( Test-Path .\12.txt ) {Remove-Item -Force .\12.txt}
- if ( Test-Path .\22.txt ) {Remove-Item -Force .\22.txt}
- $a_c = $a.Count-1
- $b_c = $b.Count-1
- $c_c = $c.Count-1
- $Tab = [char]9
- if ( $a_c -ge $b_c )
- {
-
-
- $num = $a_c
- for($i=0;$i -le $num;$i+=1)
-
- {
- if ( $i -le $b_c) {
-
- $a[$i] + $Tab + $Tab + $b[$i] | Out-File 12.txt -Append
- }
- else
- {
- Write-Output "$a[$i] + $Tab + $Tab" | Out-File 12.txt -Append
- }
-
- }
- } else
- {
- $num = $b_c
- for($i=0;$i -le $num;$i+=1)
- {
- if ( $i -le $b_c) {
-
-
- $a[$i] + $Tab + $Tab + $b[$i] | Out-File 12.txt -Append
- }
- else
- {
- $Tab + $Tab + $b[$i] | Out-File 12.txt -Append
- }
-
- }
-
- }
-
- $d = gc .\12.txt
- $d_c = $d.Count-1
- if ( $d_c -ge $num )
- {
-
- $num = $d_c
-
- for($i=0;$i -le $num;$i+=1)
-
- {
- if ( $i -le $c_c) {
-
- $d[$i] + $Tab + $Tab + $c[$i] | Out-File 22.txt -Append
- }
- else
- {
- Write-Output "$d[$i] + $Tab + $Tab" | Out-File 22.txt -Append
- }
-
- }
- } else
- {
- $num = $c_c
- for($i=0;$i -le $num;$i+=1)
- {
- if ( $i -le $c_c) {
-
-
- $d[$i] + $Tab + $Tab + $c[$i] | Out-File 22.txt -Append
- }
- else
- {
- $Tab + $Tab + $c[$i] | Out-File 22.txt -Append
- }
-
- }
-
- }
- if ( Test-Path .\12.txt ) {Remove-Item -Force .\12.txt}
复制代码
作者: idwma 时间: 2022-9-10 00:35
稍稍改一下- #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
- dir *.txt|%{$a+=,(gc $_)}
- $n=($a|%{$_.count}|measure -max).maximum
- $a|%{
- $f=++$i-1
- $l=[regex]::matches($_[0],'\t').count-1
- $s=(0..$l|%{"`t"}) -join ''
- if($n -ne $_.count){0..($n-$_.count-1)|%{$a[$f]+=,$s}}
- }
- rv i
- $b=($a|%{'$a[{0}][$i-1]' -f [int]$i++}) -join '+"`t"+'
- $c=$i-1
- rv i
- $e=while($d -notmatch "^\t{$c}$" ){
- $i++
- $d=iex $b
- $d
- }
- sc tmp.txt $e
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |