Board logo

标题: [文本处理] 使用批处理或Powershell删除txt文件中的空格和空行和-号然后另存UTF8 [打印本页]

作者: 5i365    时间: 2022-1-11 13:44     标题: 使用批处理或Powershell删除txt文件中的空格和空行和-号然后另存UTF8

本帖最后由 5i365 于 2022-1-11 14:48 编辑


在百度和坛里搜索过一些相关的贴子, 但是都不彻底, 所以新开一贴, 求高手来个总结, 详细描述如下:

使用批处理或Powershell代码:

1.先读取批处理所在文件夹下所有的txt文件,

2.删除读取到的txt文件内容中的所有空格和空行和-号
空格可能的情况有:
在一行开头
在一行结尾
在一行之中
在一行之中的符号前
在一行之中的符号后

空行可能的情况有:
在一行中只有一个空格,在上一步中删除空格后就是空行
在文本最开头
在文本最开头N行空行
在文本最结尾
在文本最结尾N行空行
在文本内部连续两个空行或多个空行

-号可能的情况有:
在一行中只有一个-号,删除-号后就是空行
在文本最开头
在文本最结尾
在文本内部连续两个-号或多个-号

3.最后转为UTF8编码后另存替换原txt文件

遇到的问题:
1.txt文件的编码有可能是ANSI也有可能是UTF8

2.删除空行, 将 \n\r 替换为 空, 好像不能删除多行的空行

3.修改UTF8编码【可参考下面代码, 这个代码也有点小问题,另存后的文件格式是UTF8_BOM, 而需要的是UTF8不带BOM】:
for /f "delims=" %%i in ('dir /b *.txt') do if exist %%i powershell "(Get-Content -Path '%%~fi') | Out-File -Encoding UTF8 -FilePath '%%~fi'"


test.txt测试文件下载
https://wss1.cn/f/7c4aabuntt6 复制链接到浏览器打开
作者: 5i365    时间: 2022-1-11 15:35

用下面的方法删除空行, 最后一行仍会有空行, UTF8也带BOM
(gc "C:\Users\Administrator\Desktop\t.txt") | ? { $_.trim() -ne "" } | sc "C:\Users\Administrator\Desktop\t2.txt" -Encoding UTF8
作者: 5i365    时间: 2022-1-11 15:45

用下面的方法可以删除空格, 感觉应该稳
(gc "C:\Users\Administrator\Desktop\t.txt") -replace '\s{1,}', "" | sc "C:\Users\Administrator\Desktop\t2.txt" -Encoding UTF8
作者: 5i365    时间: 2022-1-11 15:49

用下面的方法可以删除-号, 感觉应该稳
(gc "C:\Users\Administrator\Desktop\t.txt") -replace '-', "" | sc "C:\Users\Administrator\Desktop\t2.txt" -Encoding UTF8
作者: 5i365    时间: 2022-1-11 16:06

又找到一个更简单的方法, 但是不稳,
(gc "C:\Users\Administrator\Desktop\t.txt").Trim(" -`n`r") | sc "C:\Users\Administrator\Desktop\t2.txt" -Encoding UTF8
作者: 5i365    时间: 2022-1-11 16:23

本帖最后由 5i365 于 2022-1-11 16:41 编辑

UTF8编码搞定了, 但是所有的行都并在一行了,却是乱码
$s = (gc "C:\Users\Administrator\Desktop\t.txt") -replace '\s{1,}', ""
[io.file]::WriteAllText("C:\Users\Administrator\Desktop\t2.txt", $s)
--------------------------------------------------------------------------------
用下面的办法不并在一起了,乱码问题没搞定
$f = [io.file]::ReadAllLines('C:\Users\Administrator\Desktop\t.txt')
$s = $f -replace '\s{1,}', ""
[io.file]::WriteAllLines("C:\Users\Administrator\Desktop\t2.txt", $s)
作者: 5i365    时间: 2022-1-11 16:31

本帖最后由 5i365 于 2022-1-11 16:34 编辑

每个分步功能, 在上面都有解决方法了, 就差整合了,

请求路过的高手, 把上面的代码整合一下, 实在搞不定了, 感谢

powershell 简单点的代码大致能看懂, 但是CMD的代码很多真是看不懂




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