中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 按行号将文本中的对应行提取到新文本
作者:
标题: 按行号将文本中的对应行提取到新文本 上一主题 | 下一主题
youaoyi
初级用户





积分 154
发帖 67
注册 2007-10-31
状态 离线
『楼 主』:  按行号将文本中的对应行提取到新文本

目的是在输入一组行号后,将样本中对应的行提取出来生成一个新文本。

而在原文本中删除这些行的数据,并且不留空行。

大致构想如下,请教 ???部分应该如何写 ,谢谢。

title 按行号将文本中的对应数据提取到新文本
echo.
echo.
echo 请把要处理的TXT文本文件拖到本窗口
set wjmc=:
echo.
set /p wjmc=  待处理的文件为:
set "wjmc=%wjmc:"=%"
echo.
echo.
echo.请输入一组数,以英文逗号或空格做为分隔。
echo.( 如:“1,5,17,66” 或 “1 5 17 66”)
set/p str=—〉:
for %%i in (%str%) do (
for /f "delims=" %%a in ('findstr "^%%i|" "%wjmc%"') do ??????
)
echo.
echo.
pause>nul

[ Last edited by youaoyi on 2008-9-15 at 10:34 PM ]

2008-9-15 22:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youaoyi
初级用户





积分 154
发帖 67
注册 2007-10-31
状态 离线
『第 2 楼』:  

样本.txt
1|0757 | 合同 | 其它 | 殷晏 | 200837015029392 | 4000.0 |
2|0752 | 合同 | 经济原因 | 葛宝 | 200000026251 | 10232.35 |
3|2810 | 合同 | 经济原因 | 王传 | 2002810000013079 | 479.0 |
4|2810 | 合同 | 经济原因 | 王传 | 20028000013079 | 479.0 |
5|2810 | 合同 | 经济原因 | 趙朹 | 燕 | 200231000013099 | 939.0 |
6|2810 | 合同 | 经济原因 | 王传 | 200237281000013079 | 23.72 |
7|2810 | 合同 | 经济原因 | 王传 | 200237810000013079 | 260.28 |
8|0808 | 合同 | 经济原因 | 梁汝 | 2005300005411 | 280.0 |
9|1104 | 合同 | 其它 | 张成 | 2008374015010838 | 1630.0 |
10|1104 | 合同 | 其它 | 张成 | 200830015010838 | 36.0 |
11|1104 | 合同 | 其它 | 张成 | 200837015010845 | 10.0 |
12|1104 | 合同 | 其它 | 张成 | 20083715010845 | 10.0 |
13|1104 | 合同 | 其它 | 张成 | 20083602015010845 四湖 |

2008-9-15 22:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youaoyi
初级用户





积分 154
发帖 67
注册 2007-10-31
状态 离线
『第 3 楼』:  

提出这个问题的原因是已经找到有错误的行,如第5行\第13行,

现在想通过这个批处理输入 5,13 这两个行号, 把数据转移到一个新文本中.

处理后原文本中内容为:
1|0757 | 合同 | 其它 | 殷晏 | 200837015029392 | 4000.0 |
2|0752 | 合同 | 经济原因 | 葛宝 | 200000026251 | 10232.35 |
3|2810 | 合同 | 经济原因 | 王传 | 2002810000013079 | 479.0 |
4|2810 | 合同 | 经济原因 | 王传 | 20028000013079 | 479.0 |
6|2810 | 合同 | 经济原因 | 王传 | 200237281000013079 | 23.72 |
7|2810 | 合同 | 经济原因 | 王传 | 200237810000013079 | 260.28 |
8|0808 | 合同 | 经济原因 | 梁汝 | 2005300005411 | 280.0 |
9|1104 | 合同 | 其它 | 张成 | 2008374015010838 | 1630.0 |
10|1104 | 合同 | 其它 | 张成 | 200830015010838 | 36.0 |
11|1104 | 合同 | 其它 | 张成 | 200837015010845 | 10.0 |
12|1104 | 合同 | 其它 | 张成 | 20083715010845 | 10.0 |

新生成的文本中提取出这两条数据:
5|2810 | 合同 | 经济原因 | 趙朹 | 燕 | 200231000013099 | 939.0 |
13|1104 | 合同 | 其它 | 张成 | 20083602015010845 四湖 |


只有这样才能较为方便去修改找到的问题行,
要不然面对 http://www.cn-dos.net/forum/viewthread.php?tid=42913&fpage=1 贴中找到的上百条报错行,
(没想到这么多条数据有问题,原以为也就几条有错误,手工找找改了就完了)
委实很难手工一条一条到原数据文本中去寻觅 .......

[ Last edited by youaoyi on 2008-9-15 at 10:58 PM ]

2008-9-15 22:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youaoyi
初级用户





积分 154
发帖 67
注册 2007-10-31
状态 离线
『第 4 楼』:  

以下为 HAT 老大授予的用来查错的代码, 对应的样本也是二楼的文本,
如果能够查错时同时把错误的行数提取出来生成新文本那就更好了,
不容易做到的话, 单独一个批处也可以,但是手工一行一行去找实在太费劲了.


@echo off
setlocal enabledelayedexpansion
@title 查找分隔符个数 _ 确定问题行_如果某行的分隔符数量不符合即报错
echo.
echo.
set /p "file= 请将要处理的文本拖放到这里:"
echo.
set /p geshu= 每行中应该有几个分隔符:
set /a geshu+=1
echo.
set row=0
for /f "usebackq tokens=1-%geshu% delims=|" %%a in (%file%) do (
  set /a row+=1
  if "%%h" neq " " (
    echo !row!行中的分隔符与实际不符
  )
)
pause

[ Last edited by youaoyi on 2008-9-15 at 10:53 PM ]

2008-9-15 22:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 5 楼』:  


@echo off
setlocal enabledelayedexpansion
set /p row=你想处理那些行?
set count=0
type nul>"b.txt"
type nul>"c.txt"
for /f "usebackq delims=:" %%a in ("a.txt") do (
  set /a count+=1
  for %%h in (%row%) do (
    if "%%h" equ "!count!" (
      set rowerr=1
    )
  )
  if "!rowerr!" equ "1" (
    >>"b.txt" echo.%%a
  ) else (
    >>"c.txt" echo.%%a
  )
  set rowerr=0
)
move /y "c.txt" "a.txt"




2008-9-15 23:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 6 楼』:  

两个代码合并在一起
@echo off
setlocal enabledelayedexpansion
set /p "file=请将要处理的文本拖放到这里:"
set count=0
set row=
for /f "usebackq tokens=1-8 delims=|" %%a in (%file%) do (
  set /a count+=1
  if "%%h" neq " " (
    set row=!row!,!count!
  )
)
set count=0
type nul>"b.log"
type nul>"c.log"
for /f "usebackq delims=:" %%a in (%file%) do (
  set /a count+=1
  for %%h in (%row%) do (
    if "%%h" equ "!count!" (
      set rowerr=1
    )
  )
  if "!rowerr!" equ "1" (
    >>"b.log" echo.%%a
  ) else (
    >>"c.log" echo.%%a
  )
  set rowerr=0
)
move /y "c.log" "%file%"
[ Last edited by HAT on 2008-9-16 at 12:42 AM ]



2008-9-15 23:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youaoyi
初级用户





积分 154
发帖 67
注册 2007-10-31
状态 离线
『第 7 楼』:  

汇报:
可以实现目的,
但是大约五分钟处理一兆的数据,
这样的话.一百兆的就需要500分钟...

2008-9-15 23:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 8 楼』:  

你可以把两个功能模块的代码分开测试一下,看看是哪个部分拖慢了速度。



2008-9-15 23:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youaoyi
初级用户





积分 154
发帖 67
注册 2007-10-31
状态 离线
『第 9 楼』:  

4楼很快  5楼很慢

2008-9-15 23:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youaoyi
初级用户





积分 154
发帖 67
注册 2007-10-31
状态 离线
『第 10 楼』:  

pooronce兄提供了 gawk 的语句, 借助这个处理起来速度确实很彪悍:
gawk -F"|" -v line=7 "NF!=line+1{print>\"newfile.txt\"}NF==line+1{print>\"newfile2.txt\"}" your.txt

仍是希望看到 HAT 兄的纯批的提速版应该怎么做 ,  当作求教学习了.

2008-9-16 00:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: