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

[文本处理] 请老师抽空帮写一个批处理文本合并去重复(已解答,谢谢各位老师的帮助!)

本帖最后由 PCL0769 于 2021-10-12 17:03 编辑

01文件夹内有以下文本
1.txt
2.txt
3.txt
4.txt
......
N.txt
02文件夹内有以下文本
1.txt
2.txt
3.txt
4.txt
......
N.txt
03文件夹内有以下文本
1.txt
2.txt
3.txt
4.txt
......
N.txt
04文件夹内有以下文本
1.txt
2.txt
3.txt
4.txt
......
N.txt

05文件夹内有以下文本
........
有N个文件夹
请帮忙写一个将以上N个文件夹中的N个同名的文本合并然后生成一个新的文件夹,文件夹中同样生成合并后同名的文本
合并文件夹内有以下文本
1.txt
2.txt
3.txt
4.txt
......
N.txt

以下是原文档中的小部分格式内容,需要在合并后新生成的文本中去除不完整的行,去重复去特定行的语句,谢谢!
SZ300951        20210226        4727036
SZ300999        20210226        -201125534
SZ301000       20210原文本中少部分会有这种不完整的行,在合并后新生成的文本中将不完整的行去除)
SZ300          (原文本中少部分会有这种不完整的行,在合并后新生成的文本中将不完整的行去除)
SZ138811-QQ84299        20210226        0 (原文本中少部分会有此行,20210226 原文本中是按日期的一个变量,现需在新合并后生成的文本中将此行去除)

合并时能不能将记事本中的字符替换,替换条件如下:
SH替换成1|
SZ替换成0|   
SZ300951        20210226之间的空格替换成|   
20210226        4727036之间的空格替换成|

合并后的最终文本内容格式:
0|000001|20210104|45971388
1|600004|20210104|22269128


另:
以下是完整的两行。
SZ300951        20210226        4727036
SZ300999        20210226        -201125534

以下是不完整的两行,如果不好写就忽略此条件也行
SZ301000       20210
或者
SZ300   

以下是多余无用的行,此行内容不需要     (20210226 是按日期变化的变量)
SZ138811-QQ84299        20210226       0

不完整的行是原记事本偶尔某几个记事本中才会出现,不是所有的都会出现。
生成新的合并记事本时将这些不完整的去除,不完整的行不生成到这个新的合并记事本中。

请老师抽空帮写一个批处理,谢谢!

不完整的行,只有 1 列 2 列? 还是 列中 数据不完整?

TOP

本帖最后由 PCL0769 于 2021-10-4 12:55 编辑

回复 2# newswan
老师好!
SZ300951        20210226        4727036
SZ300999        20210226        -201125534
以上是完整的两行。

以下是不完整的两行,如果不好写就忽略此条件也行
SZ301000       20210
或者
SZ300   

以下是多余无用的行,此行内容不需要     (20210226 是按日期变化的变量)
SZ138811-QQ84299        20210226       0

不完整的行是原记事本偶尔某几个记事本中才会出现,不是所有的都会出现。
生成新的合并记事本时将这些不完整的去除,不完整的行不生成到这个新的合并记事本中

TOP

本帖最后由 newswan 于 2021-10-4 13:41 编辑

用了第三方命令 sed
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set sour=aaa
  4. set dest=bbb
  5. del %dest%\*.txt
  6. set exclude=20210226
  7. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%sour%\*.txt"`) do (
  8.     sed -r -n -e "/\w+\s+\w+\s+\w+/p" -e "/%exclude%/d" "%%~fa">> "%dest%\%%~na.txt"
  9. )
  10. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%dest%\*.txt"`) do (
  11.     set _file_=%%~fa
  12.     for /f "usebackq tokens=* delims=" %%a in ("%_file_%") do (
  13.         set __%%a=%%a
  14.     )
  15.    
  16.     (
  17.         for /f "usebackq tokens=2 delims==" %%a in (`set __`) do (
  18.             echo %%a
  19.         )
  20.     ) > "%_file_%"
  21.     rem notepad"%_file_%"
  22. )
复制代码
1

评分人数

    • PCL0769: 高技术 高人品技术 + 1

TOP

findstr 支持正则太差,所以用了sed

TOP

回复 4# newswan
老师好!
是BAT吗?双击后只是闪了一下,没运行。

TOP

本帖最后由 newswan 于 2021-10-4 13:44 编辑

回复 6# PCL0769


可能 没有 sed
论坛里下载一个,放到 c:\windows
http://www.bathome.net/thread-36408-1-1.html

TOP

本帖最后由 PCL0769 于 2021-10-4 14:03 编辑

回复 7# newswan
老师好!
看到链接了,
正式版 - http://www.bathome.net/s/tool/index.html
测试版 - http://bcn.bathome.net/s/tool/index.html
是下载其中任一一个都行吗?谢谢老师!
没找到sed下载,都是SED应用方面的,因为级别不够一小时只能跟5帖

还是闪退,没运行

TOP

TOP

我测试正确的,你自己调试一下

set sour=aaa    源路径
set dest=bbb    目的路径

set exclude=20210226   排除列表

TOP

回复 11# newswan
找不到 C:\*.txt
文件名、目录名或卷标语法不正确。

@echo off
setlocal ENABLEDELAYEDEXPANSION

set sour=C:\Users\Administrator\Desktop\15单\新建文件夹
set dest=C:\Users\Administrator\Desktop\15单\新建文件夹2

del %dest%\*.txt

for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%sour%\*.txt"`) do (
    sed -r -n -e "/\w+\s+\w+\s+\w+/p" -e "/%exclude%/d" "%%~fa">> "%dest%\%%~na.txt"
)

for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%dest%\*.txt"`) do (
    set _file_=%%~fa
    for /f "usebackq tokens=* delims=" %%a in ("%_file_%") do (
        set __%%a=%%a
    )
   
    (
        for /f "usebackq tokens=2 delims==" %%a in (`set __`) do (
            echo %%a
        )
    ) > "%_file_%"
    notepad "%_file_%"
)

TOP

本帖最后由 newswan 于 2021-10-4 15:34 编辑
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set sour=C:\Users\admin\Desktop\New folder (2)\aaa
  4. set dest=C:\Users\admin\Desktop\New folder (2)\bbb
  5. set exclude=20210226
  6. del "%dest%\*.txt"
  7. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%sour%\*.txt"`) do (
  8.     sed -r -n -e "/\w+\s+\w+\s+\w+/p" -e "/%exclude%/d" "%%~fa">> "%dest%\%%~na.txt"
  9. )
  10. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%dest%\*.txt"`) do (
  11.     for /f "usebackq tokens=* delims=" %%a in ("%%~fa") do (
  12.         set __%%a=%%a
  13.     )
  14.    
  15.     (
  16.         for /f "usebackq tokens=2 delims==" %%a in (`set __`) do (
  17.             echo %%a
  18.         )
  19.     ) > "%%~fa"
  20.     notepad.exe "%%~fa"
  21. )
复制代码
1

评分人数

    • PCL0769: 高技术 高人品技术 + 1

TOP

本帖最后由 newswan 于 2021-10-4 15:32 编辑

powershell 好一些
  1. $sour = "aaa"
  2. $dest = "bbb"
  3. $exclude = "20210227"
  4. Remove-Item $dest\*.txt
  5. Get-ChildItem -path $sour *.txt -Recurse | foreach-object {
  6.     ( get-content $_.fullname ) -match "\w+\s+\w+\s+[-]?\w+" -notmatch $exclude | out-file -append $dest\$_
  7. }
  8. Get-ChildItem -path $dest *.txt | foreach-object {
  9.     $a = get-content $_.fullname | sort-object -unique
  10.     $a | out-file $dest\$_
  11.     notepad.exe $dest\$_
  12. }
复制代码
1

评分人数

    • PCL0769: 高技术 高人品技术 + 1

TOP

本帖最后由 newswan 于 2021-10-4 15:37 编辑

目录是这样的
  1. ├───aaa
  2. │   ├───01
  3. │   └───02
  4. └───bbb
复制代码
刚才 网站 拒绝登陆

TOP

探讨关于在for循环中使用set name几个问题。
我也在关注如何解决此帖中问题,基本想法和你类似。其中有几个问题未考虑成熟:
1.当没有变量引导符时,比如set __,可以显示所有以__开头的变量,并以通常顺序显示;
2.当循环设置变量,并使用这些变量处理完成后,再次循环设置变量时,前面设置的变量并不会自动消失,还会存在,直到将它们设置为空值或是退出cmd后。
所以,使用set name来处理帖子中的问题时,如果没有顺序要求应当可行。并且要考虑在下次循环前清空前面的变量值。
我自己未想到解决的办法。

TOP

返回列表