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

[文本处理] 请教批处理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, 活動於西元十四世紀後期),江蘇華亭
人,字世良,號樗散生,有詩名,處世剛正,不合於時。明太祖時,宋濂薦於朝,累徵不起,苦志臨池,初學鍾
繇,行草學二王,與兄世長、兄子恭,具有書名,一時稱為東吳三曹。

回复 1# Ru_Evan


请选几个有代表性的文件打包上传到网盘,以便测试代码。
请把你之前的代码发出来看看,以便理解需求。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

话说不同的字体,也会导致每行的长度发生变化,特别是有数字和字母时

QQ 20147578

TOP

回复 3# czjt1234


    这种差别比起多字节字符小多了,没太大关系。。

TOP

就按宋体算,一个汉字的宽度等于两个英文字母的宽度
你再看下其它外文的字符宽度
那么可以把问题转换为判断是不是汉字

QQ 20147578

TOP

回复 5# czjt1234

应该就是你说的意思,最终目的就是让显示出来的行内容超过特定物理宽度就换行处理。。

TOP

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

评分人数

TOP

回复 7# Five66

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

TOP

返回列表