无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 5525|回复: 10
打印 上一主题 下一主题

如何把每个文件的名字 改成 该文件的第一行字

[复制链接]
跳转到指定楼层
1#
发表于 2007-6-20 20:13:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的:改文件名
具体要求:名字改为每个txt文件的第一行
比如说:不见得~1.txt.txt.txt  这个文件的第一行是 不见得--中文幽默王
那就把这个文件改名为 不见得--中文幽默王.txt
难点:主要是特殊字符的问题,空格和引号,搞了好久没完全成功
请教各位高手了
所有文件打包到附件了,全是txt的笑话,也可以看看,全部700多个呢,可是大于400kB了,包里传了140多个
我的代码如下
  1. @echo off
  2. :1
  3. setlocal enabledelayedexpansion
  4. for /f  %%i in ('dir /a-d /b /on') do (
  5. set "wj"="%%i"
  6. call :do
  7. )
  8. :do
  9. for /f   %%a in ("!wj!") do (ren  "%%i" "%%a".txt&&goto :eof)
  10. :end
  11. pause
  12. exit
复制代码

[ 本帖最后由 wjh6088 于 2007-6-20 08:15 PM 编辑 ]

笑话.rar

97 KB, 下载次数: 78, 下载积分: 无忧币 -2

2#
发表于 2007-6-21 13:09:03 | 只看该作者
  如果第一行没有出现不能作为文件名的字符的话,下面的代码应该是可行的。

  1. @echo off
  2. :: 新文件名中,前后空格已经去除,但是,没有去除中间部分的空格
  3. :: 如果第一行内容一分号打头,则提取下一行内容;若下一行还是以分号打头,则继续探测下一行内容;
  4. for %%i in (*.txt) do call :re_name "%%i"
  5. pause
  6. exit

  7. :re_name
  8. for /f "usebackq tokens=*" %%i in (%1) do ren %1 "%%~nxi.txt"&goto :eof
  9. goto :eof
复制代码

  1. @echo off
  2. :: 已经去除新文件名中的所有空格,但是速度较慢。
  3. :: 若第一行以分号打头,照样提取第一行
  4. for %%i in (*.txt) do call :re_name "%%i"
  5. pause
  6. exit

  7. :re_name
  8. for /f "delims=" %%i in ('findstr /n .* %1') do (
  9.     set "str=%%i"
  10.     setlocal enabledelayedexpansion
  11.     set str=!str:*:=!
  12.     set str=!str: =!
  13.     set str=!str: =!
  14.     ren %1 !str!.txt
  15.     endlocal
  16.     goto :eof
  17. )
复制代码
回复

使用道具 举报

3#
发表于 2007-6-21 13:11:17 | 只看该作者
  你想对特殊字符如何处理?抛弃?置换为空?继续探测下一行?
回复

使用道具 举报

4#
 楼主| 发表于 2007-6-21 16:37:13 | 只看该作者
今天考驾照去了,等了好久,不过通过了,笔试98分:lol :lol
非常感谢namejm的帮助,哈哈
特殊字符的处理不重要了,可以保留,也可以抛弃
等我测试先:)
回复

使用道具 举报

5#
 楼主| 发表于 2007-6-21 16:41:05 | 只看该作者
呵呵,厉害啊,通过了
如果不要“不见得--中文幽默王.txt”中间的那个--呢?
我自己先试试修改看
回复

使用道具 举报

6#
 楼主| 发表于 2007-6-21 18:53:11 | 只看该作者
呵呵,重点在于usebackq这个参数的使用
第二个批处理
修改了一下
可以把--后面的中文幽默王去除了
  1. for %%i in (*.txt) do call :第一种方法re_name "%%i"
  2. pause
  3. exit
  4. :第一种方法re_name
  5. for /f "usebackq  delims=-" %%i in (%1) do ren %1 "%%~nxi.txt"&goto :eof
  6. goto :eof
复制代码

下一步研究把前面几行和后面几行广告删除了

[ 本帖最后由 wjh6088 于 2007-6-21 07:19 PM 编辑 ]
回复

使用道具 举报

7#
 楼主| 发表于 2007-6-21 19:22:48 | 只看该作者
  1. @echo off
  2. :: 已经去除新文件名中的所有空格,但是速度较慢。
  3. :: 若第一行以分号打头,照样提取第一行
  4. for %%i in (*.txt) do call :re_name "%%i"
  5. pause
  6. exit

  7. :re_name
  8. for /f "delims=" %%i in ('findstr /n .* %1') do (
  9.     set "str=%%i"
  10.     setlocal enabledelayedexpansion
  11.     set str=!str:*:=!
  12.     set str=!str: =!
  13.     set str=!str: =!
  14.     ren %1 !str!.txt
  15.     endlocal
  16.     goto :eof
  17. )
复制代码
有空的话能说明一下
    set str=!str:*:=!
    set str=!str: =!
    set str=!str: =!
这3句吗,或者给个相关链接
这个赋值的用法看不懂啊,3q

[ 本帖最后由 wjh6088 于 2007-6-21 07:23 PM 编辑 ]
回复

使用道具 举报

8#
发表于 2007-6-21 23:37:13 | 只看该作者
  如果你想只提取笑话内容,并且自动重命名的话,可以使用如下代码:
  1. @echo off
  2. :: 为了兼容特殊字符,速度就一个字:慢
  3. :: 不过,还可以忍受
  4. rd /q /s 整理后笑话 2>nul
  5. md 整理后笑话
  6. for %%i in (*.txt) do call :pickup "%%i"
  7. start 整理后笑话
  8. exit

  9. :pickup
  10. set num=0
  11. set flag=
  12. for /f "delims=" %%i in ('findstr /n .* %1') do (
  13.     set "str=%%i"
  14.     call set "str=%%str: =%%"
  15.     call set "str=%%str: =%%"
  16.     call set "str=%%str:*:=%%"
  17.     if not defined flag (
  18.         call set "name=%%str:~0,-7%%"
  19.         set flag=1
  20.     )
  21.     if not defined str (
  22.         set /a num+=1
  23.     ) else (
  24.         setlocal enabledelayedexpansion
  25.         if !num! equ 8 (echo   !str!)>>整理后笑话\!name!.txt
  26.         if !num! gtr 8 goto :eof
  27.         endlocal
  28.     )
  29. )
  30. goto :eof
复制代码
  修改一下代码,每行行首空两格,以方便阅读。

[ 本帖最后由 namejm 于 2007-6-22 01:13 AM 编辑 ]
回复

使用道具 举报

9#
发表于 2007-6-21 23:48:28 | 只看该作者
原帖由 wjh6088 于 2007-6-21 07:22 PM 发表
有空的话能说明一下
    set str=!str:*:=!
    set str=!str: =!
    set str=!str: =!
这3句吗,或者给个相关链接


  一切尽在 set /? 中。

  实际上,这是个字符串替换语句,原始模型是这样的:set str=%str1:str2=str3% 。这条语句的含义是:把字符串 str1 中的所有字符串 str2 替换成字符串 str3,把替换结果保存在变量 str 中。按照这个解释,后两条语句就容易懂一点:把 str 中所有的半角、全角空格置换为空。第一条就稍微有点不好理解了,它的含义是:把字符串 str 中第一个冒号及其之前的所有字符串置换为空。
回复

使用道具 举报

10#
 楼主| 发表于 2007-6-22 00:14:22 | 只看该作者
再次set/?了一下,貌似是没有这个内容的,我的系统是xp sp2
而且系统自带的东西很多是不知所云的
不如namejm大虾说的通俗易懂啊,哈哈,收藏了

看了好久,大致上看懂了,正文部分是没有空行隔开的,通过统计空行的数目来确认----是否到达正文的内容
这个思路很巧妙啊,今天又长进了

[ 本帖最后由 wjh6088 于 2007-6-22 12:37 AM 编辑 ]
回复

使用道具 举报

11#
 楼主| 发表于 2007-6-22 00:18:56 | 只看该作者
分享其中的一个笑话
马克在机场候机。他叫住经过的一个年轻人:“先生,能请问你现在几点?”
年轻人提着两个沉重的手提箱,戴着一块大大的高科技手表,神气的答到:“当然,哪个国家?”
“你能提供几个国家的时间?”马克有兴趣的问。
“世界上所有的国家!”
“哇,太妙了!”
“那没什么,此表的功能还有全球定位系统、传真、E——MAIL,甚至还能接收电视节目并在它的彩色液晶显示屏上播放!”
“太令人难以相信了!你不介意……不介意把它卖给我吧?什么条件都行!”
“好,我的新鲜感已过去了。如果你真想要……900美元,怎么样?”
马克急不可耐地抽出支票薄,递给年轻人一张900美元的支票。年轻人脱下手表递给马克:“这是你的‘高科技’手表。”然后又递给那两只重箱子,“这是它的电池。”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-15 21:01

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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