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

[文本处理] 批处理实现删除指定行功能

@echo off
set /p m=请输入要删除的行
setlocal enabledelayedexpansion
del temp.txt 2>nul
for /f "tokens=*" %%i in (1.txt) do (
set /a n+=1
if !n! neq %m% echo %%i>>temp.txt
)
del 1.txt
ren temp.txt 1.txt
pause

========================

上面的代码可以实现删除a.txt文件中指定行的功能。
但现在的问题是:
1、我现在有一个文件夹,里面有N多的txt文件,文件名没有什么规律,我现在想删除每个文件的第一行,该怎么实现呢?
2、我发现这段代码在既使是删除一个文件中的第一行的时候运行效率也不是很高,关键在ren这句上吧?如果要是删除好几百个这样的文件的话,我想效率更不会太高的。怎么办呢?

上传一个文件,作为例子,大家尝试一下。

======================分割线===================
注:如果删除指定列呢?或者说可不可以通过这段代码改写出一个同时具有以下三个功能的P程序:
    a、可交互地指定被删除行
    b、可交互地指定被删除列
    c、可交互的同时指定被删除的行和列

如果困难,以分割线上方的问题为主。
谢谢。

删除第一行很easy了。
可交互地指定被删除行也不算很难。

可交互地指定被删除列   这个有点难度。。
可交互的同时指定被删除的行和列    难度同上

但是应该不难。。。说实话拿去给新手练手很不错哦。
等会我写代码。。。哈。我有点事先X了

TOP

本帖最后由 ivor 于 2012-2-5 17:32 编辑

删除所有*.txt 第一行
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /s /b *.txt') do (
  3. set indicator=nul
  4. for /f "useback delims=" %%b in ("%%a") do (
  5. echo %%b
  6. set indicator=%%a~
  7. )>>"!indicator!"
  8. move "%%a~" "%%a"
  9. )
  10. pause
复制代码
再附上多功能版,列数如果大于4请修改:delCols代码块
功能1.指定删除的行数 2.指定删除的列数 3.同时指定行数和列数
  1. @echo off & setlocal enabledelayedexpansion
  2. set /p rows=请输入要删除的行:
  3. set /p cols=请输入要删除的列:
  4. if defined rows call :delRows %rows% & pause
  5. if defined cols call :delCols %cols% & pause
  6. goto :eof
  7. :delRows
  8. for /f "delims=" %%a in ('dir /s /b *.txt') do (
  9.         set count = %1
  10.         for /f "useback delims=" %%b in ("%%a") do (
  11.                 set /a count += 1
  12.                 if !count! neq %1 echo %%b >>"%%a~"
  13.         )
  14.         move "%%a~" "%%a"
  15. )
  16. echo 已经处理完了行数
  17. goto :eof
  18. :delCols
  19. for /f "delims=" %%a in ('dir /s /b *.txt') do (
  20.         for /f "useback tokens=1-4" %%b in ("%%a") do (
  21.                         set 1=%%b
  22.                         set 2=%%c
  23.                         set 3=%%d
  24.                         set 4=%%e
  25.                         set "%1="
  26.                         echo !1!        !2!        !3!        !4! >>"%%a~"
  27.                         
  28.         )
  29.         move "%%a~" "%%a"
  30. )
  31. echo 已经处理完了列数
  32. goto :eof
复制代码
2

评分人数

    • hacker85: 谢谢你的热心帮忙,今天才看到回复,回头我 ...技术 + 1
    • wh1234567: 新年快乐,技术超前,呵呵,不错技术 + 1

TOP

回复 3# ivor


    为什么在我的电脑上运行没有效果呢?

TOP

回复 4# wh1234567


    请说明具体问题

TOP

本帖最后由 wh1234567 于 2012-2-4 20:10 编辑

回复 5# ivor


    第一个批处理运行后闪了一下没有处理效果,第二个运行后提示
请输入要删除的行:2
请输入要删除的列:2
系统找不到文件 C:\Document
命令语法不正确。
请按任意键继续. . .
另外楼主好像是:
三个功能的P程序:
    a、可交互地指定被删除行
    b、可交互地指定被删除列
    c、可交互的同时指定被删除的行和列
1

评分人数

TOP

回复 6# wh1234567


   sorry to that....问题有些路径含有空格。在我win7下没试出来,因为桌面路径没有空格。
问题已修复

TOP

  1. @echo off
  2. if not exist a md a
  3. for /f "delims=" %%i in ('dir /b *.txt') do more +1 "%%i">>"a\%%i.txt"
  4. pause
复制代码
1

评分人数

    • ivor: 在楼主主要的需求的情况下,more命令明显是 ...技术 + 1

TOP

本帖最后由 apang 于 2012-2-5 22:17 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p lin=请输入要删除第几行:
  3. set/p row=请输入要删除第几列:
  4. for /f "delims=" %%i in ('dir /a-d /b /s *.txt') do (
  5.         (for /f "delims=" %%j in ('type "%%i"') do (
  6.                 set n=1&set str=&&call :loop %%j
  7.                 echo !str:~3!
  8.          ))>$
  9. (set n=0
  10.         for /f "delims=" %%k in ('type "$"') do (
  11.                 set /a n+=1
  12.                 if not "!n!"=="!lin!" echo %%k
  13.         ))>$$
  14. move $$ "%%~dpi%%~nxi"&del $
  15. )
  16. :loop
  17. if "%1"=="" goto :eof
  18. if "!n!"=="!row!" shift
  19. shift&set "str=!str!   %1"&set/a n+=1&goto loop
复制代码

TOP

回复 7# ivor


    新年快乐,技术超前,办事认真负责,呵呵,不错

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /a-d/b/s *.txt') do (
  3.         (set n=0
  4.         for /f "delims=" %%j in ('type "%%i"') do (
  5.                 set /a n+=1
  6.                 if not "!n!"=="1" echo %%j
  7.         ))>$
  8.         move $ "%%i">nul
  9. )
复制代码

TOP

本帖最后由 wh1234567 于 2012-2-4 20:53 编辑

回复 3# ivor


    在删除前加上一个确认的过程功能以防错误删除,也就是说在输入第几行或列后自动提示要删除的该行或列的数据内容,如果确认无误就按回车键进行处理,如果有误可以按某个键返回重新输入,这样就一目了然避免错误删除,可加输出备份功能

TOP

回复 12# wh1234567


    请问你是楼主吗?如果添加确认功能,势必会很繁琐的

TOP

回复 13# ivor


    我不是楼主,感觉这个批处理很实用,所以也想着完美完美,呵呵

TOP

回复 9# apang


    谢谢你的回复,我将近一步测试你的代码。有问题再请教。

TOP

返回列表