|
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
状态 离线
|
|
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 |
|