标题: [文本处理] [已解决]求批处理删除相同标题中的任意一个 [打印本页]
作者: pwq 时间: 2019-6-16 20:43 标题: [已解决]求批处理删除相同标题中的任意一个
我有许多文本文件的第一行中的标题由二个紧挨着的相同内容标题组成(注意:紧挨着的,二者之间没有空格和符号)举例如下:
1.txt的第一行内容是:早晨早晨
2.txt的第一行内容是:公园的空气公园的空气
3.txt的第一行内容是:海岸边海岸边
求批处理,能批量删除第一行中二个相同标题中的任意一个,希望处理后的结果如下:
1.txt的第一行内容是:早晨
2.txt的第一行内容是:公园的空气
3.txt的第一行内容是:海岸边
拜托各位高人了,谢谢。
作者: zaqmlp 时间: 2019-6-16 21:11
本帖最后由 zaqmlp 于 2019-6-19 18:16 编辑
- @echo off
- set info=互助互利,支付宝扫码头像,感谢赞助
- rem 有问题,可加QQ956535081及时沟通
- title %info%
- cd /d "%~dp0"
- set "folder=结果"
- md "%folder%" 2>nul
- powershell -NoProfile -ExecutionPolicy bypass ^
- $files=@(dir^|?{('.txt' -eq $_.Extension) -and ($_ -is [System.IO.FileInfo])});^
- for($i=0;$i -lt $files.length;$i++){^
- write-host $files[$i].Name;^
- $text=[IO.File]::ReadAllLines($files[$i].FullName,[Text.Encoding]::Default);^
- if($text[0].trim() -match '^^(.+)\1$'){$text[0]=$matches[1]};^
- [IO.File]::WriteAllLines(('%folder%\'+$files[$i].Name), $text, [Text.Encoding]::Default);^
- }
- echo;%info%
- pause
复制代码
作者: pwq 时间: 2019-6-18 12:09
各位高手:您们好。对于我的批处理方案,至今没有回复,看来有难度,麻烦大家了。我在想:tokens=m-n这条命令是提取从m列到n列的所有字符串,这里m取1,n的取值是第一行所有字符串个数除以2,我是新手,不知道有没有这样的批处理能批量检测第一行字符串的个数再除以2,若能办到,n的取值就解决了。哪位高手有兴趣不妨试试,向高手学习。
作者: xczxczxcz 时间: 2019-6-18 12:34
回复 3# pwq
看到你的这个帖子,偶忍不住笑了。2楼不是给你答案了吗? 纯P 也就是就是计算一行多少个字再除以2,再取字符串而已。
作者: pwq 时间: 2019-6-18 15:35
回4楼,2楼提供的批处理是错的,不能使用。不信您可运行一下试试。<结果>里是空的
作者: Batcher 时间: 2019-6-18 19:07
回复 5# pwq
点击2楼左下角的回复,他会收到通知。
作者: pwq 时间: 2019-6-18 19:35
回复 2# zaqmlp
<zapmlp>大师先生:您好!
首先感谢您在百忙中为我写了这个批处理,我已下载并试运行。结果不好,<结果>中是空的,批处理没成功。给您添麻烦了,谢谢您。
作者: zaqmlp 时间: 2019-6-18 19:55
回复 7# pwq
我代码中最前面几行已经说的很明白了
作者: Batcher 时间: 2019-6-18 21:46
回复 1# pwq
测试代码之前请注意做好备份- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /b /a-d *.txt') do (
- echo 正在处理文件 %%a
- set /p FirstLine=<"%%a"
- call :GetLen FirstLine LineLen
- set /a HalfLen=LineLen/2
- (for %%i in (!HalfLen!) do (
- if "!FirstLine:~0,%%i!" equ "!FirstLine:~%%i!" (
- echo,!FirstLine:~0,%%i!
- ) else (
- echo,!FirstLine!
- )
- ))>"%%a.new"
- more +1 "%%a" >> "%%a.new"
- move /y "%%a.new" "%%a"
- )
- pause
- goto :eof
-
- :GetLen
- setlocal enabledelayedexpansion
- set "$=!%1!#"
- set N=&for %%a in (4096 2048 1024 512 256 128 64 32 16)do if !$:~%%a!. NEQ . set/aN+=%%a&set $=!$:~%%a!
- set $=!$!fedcba9876543210&set/aN+=0x!$:~16,1!
- endlocal&If %2. neq . (set/a%2=%N%)else echo %N%
- goto :eof
复制代码
作者: pwq 时间: 2019-6-19 10:33
回复 10# WHY
首先感谢WHY大师对我的关爱和指导,谢谢您。您的批处理我已下载并试运行,结果是失败的。再次谢谢您在百忙之中帮助和指导我,我是来向您学习的。谢谢!
作者: pwq 时间: 2019-6-19 10:34
回复 9# Batcher
首先感谢Batcher大师对我的关爱和指导,谢谢您。您的批处理我已下载并试运行,结果是失败的。再次谢谢您在百忙之中帮助和指导我,我是来向您学习的。谢谢!
作者: Batcher 时间: 2019-6-19 10:39
回复 12# pwq
测试文件压缩上传我试试
作者: pwq 时间: 2019-6-19 13:20
回复 13# Batcher
Batcher大师:您好。不须上传,您随便写个文本文件即可。第一行的内容是二个相同的标题(注意:紧挨着的,二者之间没有空格和符号),第二行内容随便写。见如下说明:
我有许多文本文件的第一行中的标题由二个紧挨着的相同内容标题组成(注意:紧挨着的,二者之间没有空格和符号)举例如下:
1.txt的第一行内容是:早晨早晨
2.txt的第一行内容是:公园的空气公园的空气
3.txt的第一行内容是:海岸边海岸边
求批处理,能批量删除第一行中二个相同标题中的任意一个,希望处理后的结果如下:
1.txt的第一行内容是:早晨
2.txt的第一行内容是:公园的空气
3.txt的第一行内容是:海岸边
拜托各位高人了,谢谢。
作者: Batcher 时间: 2019-6-19 13:32
回复 14# pwq
9楼代码发出来之前已经用这样的3个文件测试过了,没有发现问题。所以才需要你把测试之前的txt、测试用的bat、测试之后的txt打包压缩上传,这样我才能找到线索。
作者: pwq 时间: 2019-6-19 14:15
回复 15# Batcher
Batcher大师,您好!麻烦您了。如何上传给您?
作者: pwq 时间: 2019-6-19 14:27
回复 15# Batcher
Batcher大师,已上传,麻烦您,谢谢!
作者: WHY 时间: 2019-6-19 15:00
说不清,道不明,第一行后面那么多空格,不算字符吗?
作者: WHY 时间: 2019-6-19 15:04
- dir *.txt | forEach{$a=(type $_ -ReadCount 0); $a[0] = $a[0].Trim() -replace '^(.+)\1$', '$1'; sc ($_.BaseName + '.Log') -Value $a}
复制代码
- @for %%i in (*.txt) do sed -r "1s/^\s*(.+)\1\s*$/\1/" "%%i" > "%%~ni.Log"
复制代码
作者: Batcher 时间: 2019-6-19 15:45
回复 16# pwq
你把这些txt文件第一行结尾的空格删掉,再执行代码,试试看能成功吗?
作者: pwq 时间: 2019-6-19 17:37
回复 19# Batcher
Batcher大师,您好!照您说的做了,立马就成功了。看来是我无知,不知道文本文件第一行中文字符的后面还隐藏着空格符号,给我长知识了,真得谢谢您了。看来我许多的小说文本文件第一行中都存在这样的隐藏空格,靠我手工将它们一一删除是不可能的,有没有办法用批处理批量删除这些隐藏空格,再运行您先前的批处理删除相同标题中的任意一个,这样问题就圆满解决了。谢谢大师。麻烦您了。
作者: xczxczxcz 时间: 2019-6-19 17:40
本帖最后由 xczxczxcz 于 2019-6-19 17:56 编辑
删除了复制代码
作者: Batcher 时间: 2019-6-19 18:45
回复 20# pwq
下载命令行工具 sed.exe 并放到txt文件所在目录
http://bcn.bathome.net/s/tool/index.html?key=sed
执行代码:清理首行结尾空格.bat- @echo off
- sed -i "1s/ *$//" *.txt
复制代码
作者: smss 时间: 2019-6-19 21:09
目测是文本格式和BAT脚本格式 保存不一至导致
作者: pwq 时间: 2019-6-19 21:35
回复 22# Batcher
回复Batcher大师,您好:在您的指导下,我下载了命令行工具sed.exe,并下载了您的《清理首行行尾空格》批处理,经试用,非常好。删除了隐藏的首行行尾空格,我谢谢您了。实在不好意思,我在刚才的操作中发现还有许多文本文件第一行中的行首也有隐藏的空格,您能不能再给我写个《清理首行行首空格》批处理,这样一来,我的难题就彻底解决了。谢谢。
作者: Batcher 时间: 2019-6-19 23:33
回复 24# pwq - sed -i "1s/^ *//; 1s/ *$//" *.txt
复制代码
作者: pwq 时间: 2019-6-20 09:59
回复 25# Batcher
Batcher大师。您好。批处理我已下载并试运行,效果很好,太感谢您了。这次的批处理能同时删除行首空格和行尾空格,太完美了,这正合我的需要,再次谢谢您。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |