Board logo

标题: [文本处理] 【练习】批处理实现英文歌词居中 [打印本页]

作者: 523066680    时间: 2009-10-7 17:31     标题: 【练习】批处理实现英文歌词居中

[Promise don't come easy]
I should have known all along.
There was something wrong.
I just never read between the lines.
Then I woke up one day and found you on your way.
Leaving nothing but my heart behind.
What can I do to make it up to you.
Promises don't come easy.
But tell me if there's a way to bring you back home to stay.
Well I'd promises anything to you.
I've been walkin' around with my head hanging down.
Wondrin' what I'm gonna do.
'Cause when you walked out that door.


歌词内容如上,要求:

以cmd界面默认的80字符为一行,对歌词的每一样进行居中显示。
(batman以前给俺出的题,不知道他发过没?)

[ 本帖最后由 523066680 于 2009-10-7 17:35 编辑 ]
作者: 523066680    时间: 2009-10-7 17:34

温馨提示:

  跟刚刚发的:替换信息中n个空格为1个跳格一样,考set 的思路~
  弄得好,就不用一个个算了。
  所以也就没有特殊字符,单双字节字符混合 等的要求了~

如果出乎意料,那当然是~ 加满了!

[ 本帖最后由 523066680 于 2009-10-7 17:38 编辑 ]
作者: Seter    时间: 2009-10-7 17:43

batman发过了..不过俺没做过..做下看看
作者: Seter    时间: 2009-10-7 17:50

  1. @echo off&setlocal enabledelayedexpansion&for /f "delims=" %%i in (in.txt) do set p=                                                                                %%i&set p=!p:~-80!&echo !p:  = !
复制代码

作者: 523066680    时间: 2009-10-7 17:56

一次就中~ ^_^  
应该没有出乎意料的吧?
作者: Seter    时间: 2009-10-7 17:58

哈哈,不过不能有两个空格...我想想有没更好的办法
http://bbs.bathome.net/viewthrea ... hlight=%BE%D3%D6%D0
sed高手..findstr高手..
作者: 523066680    时间: 2009-10-7 18:01

哦 刚刚我还没细看~  差一些~
以前做的时候是

strx+80空格
选前80个字符
把strx替换掉,剩下的是后面的空格
echo,%剩下的空格/2%%strx%

看到了netbenton那个,意料之外~

[ 本帖最后由 523066680 于 2009-10-7 18:32 编辑 ]
作者: terse    时间: 2009-10-7 20:07

单字节 总一边多一格 ~
作者: 基拉freedom    时间: 2009-10-7 20:13


如果添加的空格前有一个字符
比如
  1. set p=t                                                                   %%a&set p=!p:~-80!
  2. set p=!p:t  = !
复制代码
判断是不是会简单一点 没试过
作者: Batcher    时间: 2009-10-7 22:48

建议大家时不时地就去复习一下“代码咨询&讨论版块批处理出题帖汇总整理”
http://bbs.bathome.net/thread-5417-1-1.html

温故而知新
作者: Seter    时间: 2009-10-8 08:09

原帖由 基拉freedom 于 2009-10-7 20:13 发表

如果添加的空格前有一个字符
比如set p=t                                                                   %%a&set p=!p:~-80!
set p=!p:t  = !判断是不是会简单一点 没试过

不会吧...!p:~-80!截取时t不是爆炸了么...那么!p:t  = !怎么被替换?
作者: 基拉freedom    时间: 2009-10-8 08:49

这只是一种想法 只要把标志符提前就好了
或者把-80 改为更大的 然后 用set的时候多截取空格就可以了
作者: netbenton    时间: 2009-10-8 12:57

  1. @echo off
  2. set "sp=                                                                                        " 80个空格
  3. for /f "delims=" %%a in (abc.txt) do (
  4.         set p=%sp%@#%%a
  5.         setlocal enabledelayedexpansion
  6.         set p=!p:~-81!
  7.         for /f "tokens=1 delims=@" %%b in ("!p:  = !") do endlocal&echo;%%b%%a
  8. )
  9. ::可以处理for /f 能读取到的任何半角字符
复制代码

[ 本帖最后由 netbenton 于 2009-10-12 21:21 编辑 ]
作者: keen    时间: 2009-10-12 23:04

来个VBS的:
  1. '给本VBS取名为test.vbs
  2. '运行此VBS的方式:
  3. '在CMD下输入:cscript //nologo test.vbs
  4. Set objFSO = CreateObject("Scripting.FileSystemObject")
  5. Set objTextFile = objFSO.OpenTextFile("a.txt", 1)
  6. DO Until objTextFile.AtEndOfStream
  7.     strLine = objTextFile.ReadLine
  8.     intCha = (80 - Len(strLine))\2
  9.     strSpace = Space(intCha)
  10.     WSH.StdOut.WriteLine strSpace & strLine
  11. Loop
复制代码

作者: 随风    时间: 2009-10-13 01:38

:不用判断字符数
:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1 1 20) do set "k=    !k!"
  3. for /f "tokens=* delims= " %%a in (a.txt) do (
  4.    set "str=%%a%k%"
  5.    set "str=!str:~0,79!"
  6.    set "str=!str:*%%a=!"
  7.    if "!str:~0,1!"==" " (set str=!str:  = !) else set "str="
  8.    echo !str!%%a
  9. )
  10. pause
复制代码

作者: 随风    时间: 2009-10-13 01:44

汗,发帖才看到和 netbenton 的思路一样的 ^_^
作者: 523066680    时间: 2009-10-13 08:11

1.从6楼的以前的帖看到了netbenton 用两边添加空格到80位为止的办法。学习了。
2.netbenton此次给的set 截取办法,没有考虑字符串内部的空格可能被替换。

[ 本帖最后由 523066680 于 2009-10-13 08:12 编辑 ]
作者: netbenton    时间: 2009-10-13 12:57

re 17楼

你试过了吗?
作者: 523066680    时间: 2009-10-13 17:04

哈哈 我太天真了 有个@




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