Board logo

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

作者: Ru_Evan    时间: 2023-10-16 14:25     标题: 请教批处理txt文本行内容过长时按指定字节长度换行的问题

手头有大概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, 活動於西元十四世紀後期),江蘇華亭
人,字世良,號樗散生,有詩名,處世剛正,不合於時。明太祖時,宋濂薦於朝,累徵不起,苦志臨池,初學鍾
繇,行草學二王,與兄世長、兄子恭,具有書名,一時稱為東吳三曹。
作者: Batcher    时间: 2023-10-16 15:14

回复 1# Ru_Evan


请选几个有代表性的文件打包上传到网盘,以便测试代码。
请把你之前的代码发出来看看,以便理解需求。
作者: czjt1234    时间: 2023-10-16 20:15

话说不同的字体,也会导致每行的长度发生变化,特别是有数字和字母时
作者: Ru_Evan    时间: 2023-10-16 21:14

回复 3# czjt1234


    这种差别比起多字节字符小多了,没太大关系。。
作者: czjt1234    时间: 2023-10-16 21:19

就按宋体算,一个汉字的宽度等于两个英文字母的宽度
你再看下其它外文的字符宽度
那么可以把问题转换为判断是不是汉字
作者: Ru_Evan    时间: 2023-10-16 21:25

回复 5# czjt1234

应该就是你说的意思,最终目的就是让显示出来的行内容超过特定物理宽度就换行处理。。
作者: Five66    时间: 2023-10-17 02:54

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. }
复制代码

作者: Ru_Evan    时间: 2023-10-18 20:59

回复 7# Five66

:handshake 十分感谢,,不懂powershell,我先研究研究怎么用。。。




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