Board logo

标题: [文本处理] 求助批处理多文本合并中的同行合并,不懂,求指教 [打印本页]

作者: ben3ben3    时间: 2020-5-6 15:32     标题: 求助批处理多文本合并中的同行合并,不懂,求指教

本帖最后由 ben3ben3 于 2020-5-17 12:54 编辑

txt1内容:

1|603177|48|立案日期:20200429   
1|600090|48|立案日期:20200427  
0|000662|48|立案日期:20200426  
1|600978|48|立案日期:20200424   
0|000506|48|立案日期:20200415   
0|300367|48|立案日期:20200415  

txt2内容:

1|603177|48|原因:董监高违法违规  进展:立案调查中  
1|600090|48|原因:信披违法违规  进展:立案调查中  
0|000662|48|原因:信披违法违规  进展:立案调查中  
1|600978|48|原因:信披违法违规  进展:立案调查中  
0|000506|48|原因:信披违法违规  进展:立案调查中  
0|300367|48|原因:信披违法违规  进展:立案调查中  


如何合并成如下内容:
1|603177|48|立案日期:20200429   原因:董监高违法违规  进展:立案调查中  
1|600090|48|立案日期:20200427   原因:信披违法违规  进展:立案调查中  
0|000662|48|立案日期:20200426   原因:信披违法违规  进展:立案调查中  
1|600978|48|立案日期:20200424   原因:信披违法违规  进展:立案调查中  
0|000506|48|立案日期:20200415   原因:信披违法违规  进展:立案调查中  
0|300367|48|立案日期:20200415   原因:信披违法违规  进展:立案调查中
作者: netdzb    时间: 2020-5-6 16:12

回复 1# ben3ben3

哪里不懂?代码呢?
作者: netdzb    时间: 2020-5-6 16:31

回复 1# ben3ben3

这个有点难度啊,比对2个文本的字符串,统计次数吗?
作者: Batcher    时间: 2020-5-6 16:56

回复 1# ben3ben3


    请举例说明不是【1次】的情况是什么样子的
作者: ivor    时间: 2020-5-7 08:15

次数:固定1次
  1. gc 1.txt | %{$txt1 = [regex]::Split($_,"\b(?=立案)")
  2. $txt2 = Select-String -SimpleMatch $txt1[0] 2.txt
  3. $txt2 = [regex]::Split($txt2,"\b(?=原因)")
  4. $txt3 += $_ + "1次 " + $txt2[1] + "`n"
  5. Write-Host $_"1次" $txt2[1]
  6. }
  7. [System.IO.File]::WriteAllText("3.txt",$txt3)
复制代码

作者: xp3000    时间: 2020-5-7 11:46

我估计是1txt从“立案”前面开始分割,显示1、2部分
2txt从“原因”前面开始分割,显示3、4部分
把4部分去搜索1部分,搜索的次数作为值作为变量5,
再以变量1、2、5、4排列显示
作者: smss    时间: 2020-5-7 11:58

活捉国家法院文案偷懒现场
作者: xp3000    时间: 2020-5-7 12:06

要是有关部门很可能有的还是XP,去年国庆节看见某国企XP操作系统
作者: netdzb    时间: 2020-5-7 15:37

回复 7# smss

批处理,不算偷懒吧。
作者: funken    时间: 2020-5-11 22:04

本帖最后由 funken 于 2020-5-11 22:06 编辑

这个有两个方法,可以直接搜索第三个|前相同的行合并到一行,方法二,直接依次读文本,相同行合并到一行
第二个方法速度快些,但如果文本顺序不同,就会出错,第一个慢些,但准确,不会出错

看了下,发现你这个还要有次数,就需要用到findstr搜索了,再统计含关键字,有几行来计次。
作者: gao_leyun_km    时间: 2020-5-12 19:45

本帖最后由 gao_leyun_km 于 2020-5-13 10:15 编辑

说明:该脚本对两个文件中相同编号的信息没有顺序对应要求。输出文件中次数计为2.txt中同一编号出现的次数;前四列信息均来自1.txt中该编号第一次出现的行,略不检验同1.txt其余行和2.txt相容与否;其余信息均来自2.txt中该编号第一次出现的行,略不检验同2.txt其余行相容与否。如果txt文件是UTF-8编码的把下面这个批处理用UTF-8编码存到相同目录运行即可,如果txt文档为其他编码请自行设定bat文件为相同编码,并修改chcp后的数值。正常运行cmd窗口无任何输出,运行完成后将在同一目录生成Merge.txt并自动用记事本打开。
  1. @echo off&setlocal enabledelayedexpansion&>nul chcp 65001
  2. if exist "%~dp0Merge.txt" del "%~dp0Merge.txt"
  3. for /f usebackq^ tokens^=1^,2*^ delims^=^| %%a in ("%~dp01.txt") do if not defined %%b (
  4.         set %%b=1
  5.         set N=0
  6.         for /f usebackq^ tokens^=2^,4^ delims^=^| %%d in ("%~dp02.txt") do if "%%b"=="%%d" set /a N=!N!+1&if !N! EQU 1 set O1=%%a^|%%b^|%%c&set O2=%%e
  7.         >>"%~dp0Merge.txt" echo !O1!  !N!次  !O2!
  8. )
  9. start notepad.exe "%~dp0Merge.txt"
  10. ping 127.1 -n 1 >nul
  11. exit
复制代码

作者: ben3ben3    时间: 2020-5-17 12:56

抱歉,各位老师,这个就是两个文本里面 不相同部分合并成一条,无需次数统计。我还不太懂批处理。所以求助!
作者: went    时间: 2020-5-17 14:12

生成3.txt
  1. @echo off
  2. (
  3. for /f "usebackq tokens=1-3* delims=|" %%i in ("1.txt") do (
  4. for /f "tokens=3* delims=|" %%a in ('findstr /i /c:"%%i|%%j|%%k|" 2.txt') do (
  5. echo %%i^|%%j^|%%k^|%%l^%%b
  6. )
  7. )
  8. )>3.txt
  9. pause&exit
复制代码





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