Board logo

标题: [文本处理] 批处理实现删除指定行功能 [打印本页]

作者: hacker85    时间: 2012-2-4 15:34     标题: 批处理实现删除指定行功能

@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、可交互的同时指定被删除的行和列

如果困难,以分割线上方的问题为主。
谢谢。
作者: canyuexiaolang    时间: 2012-2-4 16:11

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

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

但是应该不难。。。说实话拿去给新手练手很不错哦。
等会我写代码。。。哈。我有点事先X了
作者: ivor    时间: 2012-2-4 17:53

本帖最后由 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
复制代码

作者: wh1234567    时间: 2012-2-4 19:53

回复 3# ivor


    为什么在我的电脑上运行没有效果呢?
作者: ivor    时间: 2012-2-4 20:00

回复 4# wh1234567


    请说明具体问题
作者: wh1234567    时间: 2012-2-4 20:08

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

回复 5# ivor


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

回复 6# wh1234567


   sorry to that....问题有些路径含有空格。在我win7下没试出来,因为桌面路径没有空格。
问题已修复
作者: 545810831    时间: 2012-2-4 20:35

  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
复制代码

作者: apang    时间: 2012-2-4 20:41

本帖最后由 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
复制代码

作者: wh1234567    时间: 2012-2-4 20:42

回复 7# ivor


    新年快乐,技术超前,办事认真负责,呵呵,不错
作者: apang    时间: 2012-2-4 20:44

  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. )
复制代码

作者: wh1234567    时间: 2012-2-4 20:50

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

回复 3# ivor


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

回复 12# wh1234567


    请问你是楼主吗?如果添加确认功能,势必会很繁琐的
作者: wh1234567    时间: 2012-2-4 21:07

回复 13# ivor


    我不是楼主,感觉这个批处理很实用,所以也想着完美完美,呵呵
作者: hacker85    时间: 2012-2-5 16:21

回复 9# apang


    谢谢你的回复,我将近一步测试你的代码。有问题再请教。
作者: hacker85    时间: 2012-2-5 16:22

回复 14# wh1234567


    没有关系,大家都是楼主,都可以针对这个问题还畅所欲言,要知道把一个软件做到尽量完美是一种享受。
作者: hacker85    时间: 2012-2-5 16:25

回复 13# ivor


    呵呵,这个功能可以考虑一下。
如果实在繁琐的话,那就不要用P程序来实现了,用别的语言我想更合适一些,比如VBA
作者: hacker85    时间: 2012-2-5 16:26

回复 11# apang


    再次感谢,不断地写代码,不断地突破自己,加油,向你学习。
作者: hacker85    时间: 2012-2-5 16:55

本帖最后由 hacker85 于 2012-2-5 17:12 编辑

回复 3# ivor


    你的第二段代码似乎没有删除行的功能呢?
我测试了好些次,都只能删除列,不能删除行。请查看

而且在代码运行结束后的窗口中,最后几行的内容是这样的:
已经处理完了列数
请按任意键继续. . .
跳过了= =?      ----------->这几个字符,我在你的代码里也有看到,你赋予它的作用是什么呢?或者说在什么情况下它的显示内容不是这个。
请按任意键继续. . .
作者: hacker85    时间: 2012-2-5 17:02

回复 9# apang


    这段代码是一个只能删除列功能的代码,问题如下:
1、文件的名字中不能有空格
2、只能一次处理一个文件。
作者: hacker85    时间: 2012-2-5 17:06

本帖最后由 hacker85 于 2012-2-5 20:44 编辑

回复 8# 545810831


    感谢你的回复。

这个代码只实现了分割线以上的功能。
作者: hacker85    时间: 2012-2-5 17:08

回复 11# apang


    这个代码的功能是删除所有文件的第一行。
帖子中分割线以上的功能实现了。
作者: ivor    时间: 2012-2-5 17:32

回复  ivor


    你的第二段代码似乎没有删除行的功能呢?
我测试了好些次,都只能删除列,不能删除行 ...
hacker85 发表于 2012-2-5 16:55



    我测试好用啊,删除指定行可以,指定列也没啥问题啊,你哪运行的环境是什么情况。那个echo去掉了,没有多大实际意义。
作者: cjiabing    时间: 2012-2-5 19:18

  1. ::替换1、4、7、8行为a、b、c、d。也可以替换为空值!
  2. ::如果删除前几行,一般用more或for的skip。删除任意指定行则需要一个定位行的功能。
  3. @echo off&setlocal EnableDelayedExpansion
  4. for /f "tokens=1,* delims=:" %%a in ('"findstr /n .* %1"') do (
  5.     set _var=%%b
  6.     if 1==%%a set _var=啊啊啊啊
  7.     if 4==%%a set _var=爸爸爸爸
  8.     if 7==%%a set _var=常常常常
  9.     if 8==%%a set _var=地对地导弹
  10.     echo;!_var!
  11. )
  12. pause
复制代码

作者: hacker85    时间: 2012-2-5 20:28

回复 23# ivor


   我是win7 32位旗舰。
我想这个和系统没有关系吧。

我就是把附件的文件复制了N多个
然后运行的P程序,结果第二段代码确实只有删除列的功能。

明天我再换一台机器试验一下,届时再交流。
作者: hacker85    时间: 2012-2-5 20:29

本帖最后由 hacker85 于 2012-2-5 20:39 编辑

回复 24# cjiabing


    版主这是?

代码的功能肯定是不正确的,不过里面的“说明”部分我倒是受教了。
作者: apang    时间: 2012-2-5 22:24

回复 20# hacker85

9#修改下,要不要再试试?
作者: drew2003    时间: 2012-2-6 11:18

学习了~感谢
作者: hacker85    时间: 2012-2-6 20:36

回复 27# apang


    好的,我去测试。
作者: hacker85    时间: 2012-2-6 20:38

回复 9# apang


    恩哼, 不错,你这个代码的功能是正确的。
作者: hacker85    时间: 2012-2-6 20:40

本帖最后由 hacker85 于 2012-2-6 20:42 编辑

回复 3# ivor


    第二段代码确实是没有删除行的功能,我反复测试了几次。比如删除第一行和第二列。
9楼的朋友上传了一份代码,可以实现同时删除。
作者: hacker85    时间: 2012-2-7 10:18

回复 3# ivor


    第二段代码我放到一个64位的 win7系统中使用是正确的,可以删除行了。
但是我想不是系统多少位的原因。

可是在我家里的机器上确实是不能删除行,这是为什么呢?
作者: ivor    时间: 2012-2-7 11:00

不知道丫
作者: hacker85    时间: 2012-2-8 20:35

回复 33# ivor


    在吗?我给你发了私信,里面有我的QQ。我可以把代码的执行情况给你反映一下。
作者: chm8624    时间: 2016-8-11 14:13

回复 9# apang

你的功能是很好,
但是如果 是多行删除,如何操作??

能否修改成这样的一个批处理文件,谢谢了:
方案1
删除 文本1.txt 第7到 107行的内容,
删除 文本1.txt 第122(7+115)到225(107+115)行的内容,
...
删除  文本1.txt 第(7+115*x)到225(107+115*x)行的内容, 直至文本最后
行程形成新的文件2.txt


或者也可以是
方案2
读取 文本1.txt 第1到6 行的内容, 第108到115 行的内容 复制 写入 2.txt
读取 文本1.txt 第1+115*x到6+115*x 行的内容, 第108+115*x到115+115*x 行的内容 复制 写入 2.txt   直至文本最后
x不确定。

作者: pcl_test    时间: 2016-8-11 14:25

回复 35# chm8624

@findstr /i /v /c:"Request timed out" /c:"TTL=" "D:\1.txt"
@pause
作者: chm8624    时间: 2016-8-11 14:59

回复 36# pcl_test


    版主,你的代码很有效,我自己改了一下,使之输出到 文件:
@findstr /i /v /c:"Request timed out" /c:"TTL=" "C:\00_EIS\1.txt" >>RR_01.txt
@pause

能大概的讲解一下吗?
我只能够 猜到, "Request timed out"  表示 删除 带有 "Request timed out" 的那一行,"TTL="表示会删除 带有"TTL="的那一行

处理后的文本:
--------------------------------------------------  
Start at
2016/08/08 周一
20:03:18.32

Pinging google.com [74.125.130.138] with 32 bytes of data:

Ping statistics for 74.125.130.138:
    Packets: Sent = 100, Received = 100, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 78ms, Maximum = 114ms, Average = 84ms
end at
2016/08/08 周一
20:04:57.80
--------------------------------------------------  



待处理的文本:
--------------------------------------------------  
Start at
2016/08/08 周一
20:03:18.32

Pinging google.com [74.125.130.138] with 32 bytes of data:
Reply from 74.125.130.101: bytes=32 time=82ms TTL=41
Request timed out.
......
Reply from 74.125.130.101: bytes=32 time=82ms TTL=41

Ping statistics for 74.125.130.138:
    Packets: Sent = 100, Received = 100, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 78ms, Maximum = 114ms, Average = 84ms
end at
2016/08/08 周一
20:04:57.80
--------------------------------------------------
作者: pcl_test    时间: 2016-8-11 15:02

回复 37# chm8624

cmd窗口查看 findstr /?命令
作者: chm8624    时间: 2016-8-11 15:17

回复 38# pcl_test

谢谢指导。

还有一点,如何删除 “空的行” 或者 屏蔽符比如 回车,空格等等。

@  命令行回显屏蔽符
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]
  /I         指定搜索不分大小写。
  /V        只打印不包含匹配的行。
  /C:string 使用指定字符串作为文字搜索字符串。
作者: pcl_test    时间: 2016-8-11 15:27

本帖最后由 pcl_test 于 2016-8-11 16:54 编辑

回复 39# chm8624
  1. ::删除空行
  2. findstr /rc:"[^ ]" "1.txt"
复制代码

作者: chm8624    时间: 2016-8-11 16:42

回复 40# pcl_test


    谢谢!

::删除多余信息
@findstr /i /v /c:"Request timed out" /c:"TTL=" /c:"Start at" /c:"end at" /c:"Ping statistics"  "C:\00_EIS\1.txt" >>R1_1.txt
::删除空行
findstr /rc:"[^         ]"  "R1_1.txt" >>R2_1.txt
@pause

结果很完美了,
--------------------------------------------------  
2016/08/08 周一
20:03:18.32
Pinging google.com [74.125.130.138] with 32 bytes of data:
    Packets: Sent = 100, Received = 100, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 78ms, Maximum = 114ms, Average = 84ms
2016/08/08 周一
20:04:57.80
--------------------------------------------------  
--------------------------------------------------  
2016/08/08 周一
20:33:26.59
Pinging google.com [74.125.130.101] with 32 bytes of data:
    Packets: Sent = 100, Received = 99, Lost = 1 (1% loss),
Approximate round trip times in milli-seconds:
    Minimum = 81ms, Maximum = 83ms, Average = 81ms
2016/08/08 周一
20:35:09.60
--------------------------------------------------
作者: meiszp    时间: 2016-11-10 17:06

回复 9# apang

为什么处理完,所有txt内容都是很多列~3。
作者: meiszp    时间: 2016-11-10 17:06

回复 41# chm8624
求分享代码。谢谢!




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