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

[文本处理] 求助批处理多文本合并中的同行合并,不懂,求指教

本帖最后由 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   原因:信披违法违规  进展:立案调查中

回复 1# ben3ben3

哪里不懂?代码呢?

TOP

回复 1# ben3ben3

这个有点难度啊,比对2个文本的字符串,统计次数吗?

TOP

回复 1# ben3ben3


    请举例说明不是【1次】的情况是什么样子的
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

次数:固定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)
复制代码
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

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

TOP

活捉国家法院文案偷懒现场

TOP

要是有关部门很可能有的还是XP,去年国庆节看见某国企XP操作系统

TOP

回复 7# smss

批处理,不算偷懒吧。

TOP

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

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

看了下,发现你这个还要有次数,就需要用到findstr搜索了,再统计含关键字,有几行来计次。

TOP

本帖最后由 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
复制代码

TOP

抱歉,各位老师,这个就是两个文本里面 不相同部分合并成一条,无需次数统计。我还不太懂批处理。所以求助!

TOP

生成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
复制代码

TOP

返回列表