找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 21734|回复: 7

[文本处理] 请教批处理txt文本行内容过长时按指定字节长度换行的问题

[复制链接]
发表于 2023-10-16 14:25:28 | 显示全部楼层 |阅读模式
手头有大概300多万份TXT文件,UTF-8编码,内容包含中文、英文、日文、韩文、西里尔文等等几种种语言
需要将其中某些内容太长的行内容换行处理(多数行字符都是单字节和多字节字符混合共存)
前段时间写了按字符数换行的脚本,但因多数行内容为单字节字符和多字节字符共存,换行处理后,行内容长长短短,非常不统一
故而向大家请教让内容过长的行按字节长度换行的批量处理解决办法,可以是批处理代码,可以是软件,还可以是解决方案。。
先拜谢。。。

比如:文本“曹善.txt”
换行前内容:
曹善(Ts'ao Shan, style name Shih-liang, sobriquet Shu-san-sheng, 活動於西元十四世紀後期),江蘇華亭人,字世良,號樗散生,有詩名,處世剛正,不合於時。明太祖時,宋濂薦於朝,累徵不起,苦志臨池,初學鍾繇,行草學二王,與兄世長、兄子恭,具有書名,一時稱為東吳三曹。

换行后内容:
曹善(Ts'ao Shan, style name Shih-liang, sobriquet Shu-san-sheng, 活動於西元十四世紀後期),江蘇華亭
人,字世良,號樗散生,有詩名,處世剛正,不合於時。明太祖時,宋濂薦於朝,累徵不起,苦志臨池,初學鍾
繇,行草學二王,與兄世長、兄子恭,具有書名,一時稱為東吳三曹。
发表于 2023-10-16 15:14:18 | 显示全部楼层
回复 1# Ru_Evan


请选几个有代表性的文件打包上传到网盘,以便测试代码。
请把你之前的代码发出来看看,以便理解需求。
发表于 2023-10-16 20:15:30 | 显示全部楼层
话说不同的字体,也会导致每行的长度发生变化,特别是有数字和字母时
 楼主| 发表于 2023-10-16 21:14:02 | 显示全部楼层
回复 3# czjt1234


    这种差别比起多字节字符小多了,没太大关系。。
发表于 2023-10-16 21:19:05 | 显示全部楼层
就按宋体算,一个汉字的宽度等于两个英文字母的宽度
你再看下其它外文的字符宽度
那么可以把问题转换为判断是不是汉字
 楼主| 发表于 2023-10-16 21:25:14 | 显示全部楼层
回复 5# czjt1234

应该就是你说的意思,最终目的就是让显示出来的行内容超过特定物理宽度就换行处理。。
发表于 2023-10-17 02:54:29 | 显示全部楼层
powershell
遍历当前目录所有txt文件(包括子目录)
以字体大小9的微软雅黑,计算字符宽度,宽度大于607时添加换行符(CRLF)
完事后,会在原来的文件名前添加new_new_前缀,生成新的txt文件
请不要吐槽效率

  1. #@&cls&pause&powershell "type -literalpath '%~f0'|out-string|iex"&pause&exit/b

  2. $linewidth=607
  3. $fontname='Microsoft YaHei'
  4. $fontsize=9
  5. $wd=@{}

  6. Add-Type -AssemblyName system.drawing
  7. $font=[System.Drawing.Font]::new($fontname,[single]$fontsize)
  8. $canvas=[System.Drawing.Graphics]::FromImage([System.Drawing.Bitmap]::new(64,64))

  9. $files=[object[]](gci -r -filter "*.txt")

  10. foreach($file in $files){
  11. $lines=[object[]](gc -Encoding utf8 -LiteralPath ($file.fullname))

  12. (0..($lines.length-1)).foreach({
  13. $line=$lines[$_].ToCharArray()

  14. if($line){
  15. $s=''
  16. $w=0
  17. $line|%{
  18. if($wd.Contains($_)){
  19. $w+=$wd[$_];$s+=$_
  20. }else{
  21. $z=$canvas.MeasureString($_,$font).width
  22. $wd.add($_,$z)
  23. $w+=$z;$s+=$_
  24. }
  25. if($w -gt $linewidth){$s+="`r`n";$w=0}
  26. }
  27. $lines[$_]=$s
  28. }
  29. })

  30. sc -Value $lines -Encoding utf8 -LiteralPath ($file.DirectoryName+"\new_new_"+$file.Name)
  31. }

复制代码

评分

参与人数 2技术 +2 收起 理由
buyiyang + 1 感谢分享
czjt1234 + 1 技术高超

查看全部评分

 楼主| 发表于 2023-10-18 20:59:19 | 显示全部楼层
回复 7# Five66

:handshake 十分感谢,,不懂powershell,我先研究研究怎么用。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 11:52 , Processed in 0.020655 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表