一个txt文件中,如何用批处理导出固定开头的固定长度非固定位置的字符

比如,log.txt文件中 有大概如下内容
“DSS112211100009试试的价格卡了坤宁宫是就开始锻炼高考阿娇快乐时光DSS112211100012就开始了大半年2 3nnk2kn”
需要做到的是,将这个文件中每个无论在什么位置的以DSS开头后面的12位数字进行导出。导出的效果就是拷贝到另一个文件比如2.txt
DSS112211100009
DSS112211100012
(如果能去掉2.txt的重复就更好了,各位帮帮忙,后面这点如果都做到我会增添100分数)

第1个回答  2013-07-13
用VFP编程很简单。不过如果文件不是特别大,用WORD就行了呀。
1查找^p全部替换掉(^p就是回车)
2.查找DSS,全部替换成^pDSS
如果不是太多按住Alt键不放,用鼠标选定前面要的内容,复制到新的文件中就行了
如果行太多,可以把第2步处理过的文件存为.TXT后用excel打开,在第二列输入公式
=left(a1,15)
……
……
按第二列排序,用“删除重复”的功能删除重复数据,将第二列复制到文本文件中就行了。
第2个回答  2013-07-13
我也建议您先用word处理一步,就是将log.txt中所有的DSS替换成^pDSS;
然后将如下的批处理与log.txt存在同一个文件夹中,双击运行即可:
@echo off
@setlocal enabledelayedexpansion

rem 初始化
@del 2.txt
rem 提取内容
@for /f "delims=" %%i in (log.txt) do (
@set a=%%i
@if not "!a!"=="" @echo !a:~0,15!>>3.txt
)
rem 取消重复
@sort 3.txt >4.txt
@set step=1
@for /f "delims=" %%i in (4.txt) do (
@if !step! equ 1 (
@set a=0
) else (
@set a=!b!
)
@set b=%%i
if not !a!==!b! @echo !b!>>2.txt
@set /a step+=1
)
rem 清理
@del 3.txt
@del 4.txt

@echo 处理完毕

在Win7下测试通过,最后生成的2.txt中的内容是排序并消重复的结果。追问

"我也建议您先用word处理一步,就是将log.txt中所有的DSS替换成^pDSS;“这一步可否用批处理在一起实现?

第3个回答  2013-07-13
@echo off
setlocal enabledelayedexpansion
set f1=log.txt
set f2=2.txt
set "s=[0-9][0-9][0-9][0-9][0-9][0-9]"
set "s=%s%%s%"
for /f "tokens=*" %%i in ('type "%f1%"')do (
  set "h=y%%iy"
  for %%j in ("!h:Dss=" "!")do (
    set "q=%%~j"
    if not "!q:~11!"=="" set "#!q:~,12!=y" 2>nul
))
(for /f "delims=#=" %%i in ('set #^|findstr "%s%"'
)do echo DSS%%i)>"%f2%"
pause

追问

这个我试验了 确实挺不错,可是有两个bug ,一个是因为/f "tokens=*" %%i in ('type "%f1%"') 全文都放进去了,出现了一个情况,就是如果我log过大,就会丢失,能否改成一行行读取进行筛选,然后再对筛选出来的内容进行排除重复?

我筛选的时候发现“【】”这种字符貌似会出错。。。。

追答@echo off
set f1=log.txt
set f2=2.txt
set "s=[0-9][0-9][0-9][0-9][0-9][0-9]"
set "s=%s%%s%"
echo 正在获取. . .&echo.
(for /f "tokens=1* delims=:" %%h in ('findstr/ni "dss%s%" "%f1%"')do (
  >con set/p=第 %%h 行<nul
  set "h=y%%iy"
  setlocal enabledelayedexpansion
  for %%j in ("!h:Dss=" "DSS!")do (
    set "q=%%~j"
    set "q=!q:~,15!"
    echo.!q!)
  endlocal))>"%temp%\#"
echo.&echo.
setlocal enabledelayedexpansion
(for /f %%i in ('findstr/i "dss%s%" "%temp%\#"^|sort')do (
  if not defined #%%i (
    if defined ## call set "%%!##!%%="
    set ##=#%%i&set #%%i=y
    echo %%i)))>"%f2%"
del "%temp%\#"
pause

 追问后改写过的,能适合稍大一些文件,现还是再改写一下。另有位网友答的并没判断dss后是否为数字,我答的是判断了的,但并不是越严谨越好,那是会影响运行速度的,有些情况描述详细些不仅减少代码难度,重要的是对使用有利。 比如有的段是否很长、是否虽然文件很大但涉及获取的行不多... 等等。之前写的主要有三点没考虑:出现特征串数太多、文本中有半角"!"符会丢失该行成对“!”之间的数据、丢失以";"符开头行的数据。现写的代码已纠正,考虑大文件运行时间长等待难耐增加屏幕显示原文件具特征行的行序,当然如果文件特别大,由于现有CMD命令的局限性还是会有问题的

本回答被提问者采纳
第4个回答  2013-07-13
建议你到bat吧问问,那里有一堆大神。。。
相似回答