Board logo

标题: [文本处理] 批处理实现中文段落横排转竖排 [打印本页]

作者: hanyeguxing    时间: 2010-12-8 16:00     标题: 批处理实现中文段落横排转竖排

文本要求:为了美观,所有字符均为中文全角字符。
样本:
  1.    将进酒 李白
  2. 君不见,黄河之水天上来,奔流到海不复回。
  3. 君不见,高堂明镜悲白发,朝如青丝暮成雪。
  4. 人生得意须尽欢,莫使金樽空对月。
  5. 天生我材必有用,千金散尽还复来。
  6. 烹羊宰牛且为乐,会须一饮三百杯。
  7. 岑夫子,丹丘生,将进酒,杯莫停。
  8. 与君歌一曲,请君为我侧耳听。
  9. 钟鼓馔玉不足贵,但愿长醉不复醒。
  10. 古来圣贤皆寂寞,唯有饮者留其名。
  11. 陈王昔时宴平乐,斗酒十千恣欢谑。
  12. 主人何为言少钱,径须沽取对君酌。
  13. 五花马,千金裘,呼儿将出换美酒,
  14. 与尔同销万古愁。
复制代码
从左向右排列:
  1. @echo off&setlocal enabledelayedexpansion
  2. set var=1.txt
  3. for /f "delims=" %%a in (%var%) do call:han "%%a"
  4. for /l %%a in (1,1,%Ye%) do set Xing= !Xing!
  5. for /f "delims=" %%a in (%var%) do (
  6.         set Han=%%a%Xing%
  7.         for /l %%b in (0,1,%Ye%) do set #%%b=!#%%b! !Han:~%%b,1!
  8. )
  9. set/a Ye-=1
  10. for /l %%a in (0,1,%Ye%) do echo !#%%a!
  11. pause
  12. :han
  13. set Han=%~1
  14. if defined Ye (set Gu=%Ye%) else set Gu=0
  15. :ye
  16. if "!Han:~%Gu%,1!"=="" (
  17.         if "%Ye%"=="" set Ye=%Gu%
  18.         if %Gu% gtr %Ye% set Ye=%Gu%
  19.         goto:eof
  20. )
  21. set/a Gu+=1
  22. goto:ye
复制代码
效果:
  君 君 人 天 烹 岑 与 钟 古 陈 主 五 与
  不 不 生 生 羊 夫 君 鼓 来 王 人 花 尔
  见 见 得 我 宰 子 歌 馔 圣 昔 何 马 同
将 , , 意 材 牛 , 一 玉 贤 时 为 , 销
进 黄 高 须 必 且 丹 曲 不 皆 宴 言 千 万
酒 河 堂 尽 有 为 丘 , 足 寂 平 少 金 古
  之 明 欢 用 乐 生 请 贵 寞 乐 钱 裘 愁
李 水 镜 , , , , 君 , , , , , 。
白 天 悲 莫 千 会 将 为 但 唯 斗 径 呼  
  上 白 使 金 须 进 我 愿 有 酒 须 儿  
  来 发 金 散 一 酒 侧 长 饮 十 沽 将  
  , , 樽 尽 饮 , 耳 醉 者 千 取 出  
  奔 朝 空 还 三 杯 听 不 留 恣 对 换  
  流 如 对 复 百 莫 。 复 其 欢 君 美  
  到 青 月 来 杯 停   醒 名 谑 酌 酒  
  海 丝 。 。 。 。   。 。 。 。 ,  
  不 暮                      
  复 成                      
  回 雪                      
  。 。  

从右向左排列:把 set #%%b=!#%%b! !Han:~%%b,1! 改成 set #%%b=!Han:~%%b,1! !#%%b!
效果:
与 五 主 陈 古 钟 与 岑 烹 天 人 君 君  
尔 花 人 王 来 鼓 君 夫 羊 生 生 不 不  
同 马 何 昔 圣 馔 歌 子 宰 我 得 见 见  
销 , 为 时 贤 玉 一 , 牛 材 意 , , 将
万 千 言 宴 皆 不 曲 丹 且 必 须 高 黄 进
古 金 少 平 寂 足 , 丘 为 有 尽 堂 河 酒
愁 裘 钱 乐 寞 贵 请 生 乐 用 欢 明 之  
。 , , , , , 君 , , , , 镜 水 李
  呼 径 斗 唯 但 为 将 会 千 莫 悲 天 白
  儿 须 酒 有 愿 我 进 须 金 使 白 上  
  将 沽 十 饮 长 侧 酒 一 散 金 发 来  
  出 取 千 者 醉 耳 , 饮 尽 樽 , ,  
  换 对 恣 留 不 听 杯 三 还 空 朝 奔  
  美 君 欢 其 复 。 莫 百 复 对 如 流  
  酒 酌 谑 名 醒   停 杯 来 月 青 到  
  , 。 。 。 。   。 。 。 。 丝 海  
                      暮 不  
                      成 复  
                      雪 回  
                      。 。  


if defined Ye (set Gu=%Ye%) else set Gu=0 的作用是加速子命令循环

[ 本帖最后由 hanyeguxing 于 2010-12-8 16:07 编辑 ]
作者: sxw    时间: 2010-12-8 17:03     标题: 回复 1楼 的帖子

Hanyeguxing能讲解一下代码吗?
比如#号怎么用啊?
作者: hanyeguxing    时间: 2010-12-8 18:55

原帖由 sxw 于 2010-12-8 17:03 发表
Hanyeguxing能讲解一下代码吗?
比如#号怎么用啊?

本代码是可以不用#的。
有些时候,我们需要将某些字符串定义为变量,但这些字符串有可能和本已经存在的环境变量冲突,或和默认的环境变量冲突。
例如 for /f in (1.txt) do set %%a=0
如果 %%a 可能为var,而var这个变量名在这之前被使用过,这样就造成了问题
再如 %%a 可能为tmp,而tmp这个变量名是默认的环境变量名,将直接造成%tmp%的变更。
而一般情况下,环境变量中,不会使用#、@等字符开头的变量名,所以加上这样的字符可避免变量名的冲突。
至于习惯上把这个字符加在前面,是为了set # 时调试时或使用时的方便。
作者: sxw    时间: 2011-3-6 14:36

he,看不懂,不知道是怎样的思路.




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