Board logo

标题: [文本处理] 排批处理怎样从多文本中提取任意一行文字组合? [打印本页]

作者: yimei_0210    时间: 2015-1-31 17:08     标题: 排批处理怎样从多文本中提取任意一行文字组合?

假设有两个文本:
文本A内容如下:
1
2
3
4
文本B内容如下:
a
s
d
f
g

希望生成一个C文件,
每点击一次批处理文件,在C文件里会产生任意两行数据,比如
第一次生成的是1a(希望能实现换行,如有难度不换行也可以)
第二次生成的是1s
第三次生成的是3g

纠结很久,先在这里谢过啦~
作者: pcl_test    时间: 2015-1-31 17:21

回复 1# yimei_0210
1、任意是随机的意思吗?
2、包括重复的吗?
作者: yimei_0210    时间: 2015-1-31 17:41

本帖最后由 yimei_0210 于 2015-1-31 17:44 编辑

任意是随机
不要出现11  22这样的重复数据 谢谢
作者: yimei_0210    时间: 2015-1-31 17:59

2、包括重复的吗?  是指这种情况吗? 第一次生成的是1a  第二次也可以是1a  这个不要有~~
作者: pcl_test    时间: 2015-1-31 18:46

本帖最后由 pcl_test 于 2015-1-31 19:15 编辑

回复 4# yimei_0210
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. if not exist C.txt cd.>C.txt
  4. :main
  5. set Alines=0
  6. set Blines=0
  7. for /f "tokens=* delims=" %%a in (A.txt) do (
  8. set /a Alines+=1
  9. )
  10. for /f "tokens=* delims=" %%b in (B.txt) do (
  11. set /a Blines+=1
  12. )
  13. set /a n1=%random%%%%Alines%+1
  14. set /a m1=%random%%%%Blines%+1
  15. set n2=0
  16. for /f "delims=" %%i in (A.txt) do (
  17. set /a n2+=1
  18. if "!n2!" == "%n1%" set Astr=%%i &&goto main1
  19. )
  20. :main1
  21. set m2=0
  22. for /f "delims=" %%j in (B.txt) do (
  23. set /a m2+=1
  24. if "!m2!" == "%m1%" set Bstr=%%j &&goto main2
  25. )
  26. :main2
  27. set Astr=%Astr:~0,-1%
  28. set Bstr=%Bstr:~0,-1%
  29. set word=%Astr%%Bstr%
  30. for /f "delims=" %%c in (C.txt) do (
  31. if "%word%." equ "%%c." (goto main)
  32. )
  33. echo %word%>>C.txt
复制代码

作者: 慕夜蓝化    时间: 2015-1-31 19:03

  1. @echo off&setlocal enabledelayedexpansion
  2. :start
  3. set/a a=0,b=0,n=0,u=0,v=0,r=0
  4. (for /f "tokens=1-2 delims=:" %%i in ('type "A.txt"^|find /v /c "" ^&type "A.txt"^|findstr -Rn ".*"') do (
  5.     set/a a+=1
  6.     if !a! equ 1 set/a "n=%random%%%%%i"
  7.     if !n! neq 0 (set/a u+=1) else (goto :start)
  8.     if !u! neq 1 if %%i equ !n! set/p=%%j<nul&call :a&exit /b
  9. )) >>C.txt
  10. :a
  11. set/a a=0,b=0,n=0,u=0,v=0,r=0
  12. for /f "tokens=1-2 delims=:" %%i in ('type "B.txt"^|find /v /c "" ^&type "B.txt"^|findstr -Rn ".*"') do (
  13.     set/a b+=1
  14.     if !b! equ 1 set/a "r=%random%%%%%i"
  15.     if !r! neq 0 (set/a v+=1) else (goto :a)
  16.     if !v! neq 1 if %%i equ !r! set/p=%%j<nul&echo,&goto :eof
  17. )
复制代码
每点击一次,注入每次的随机提取数。
作者: yimei_0210    时间: 2015-1-31 23:04

回复 5# pcl_test



测试了5楼的写法,正符合需求。

真心感谢~~辛苦了!
作者: yimei_0210    时间: 2015-1-31 23:09

回复 6# 慕夜蓝化

六楼的写法,在多次点击后,会出现重复数据呢,不知何解。
作者: 慕夜蓝化    时间: 2015-2-1 09:07

回复 8# yimei_0210

恩,因为没有考虑c.txt中的内容,我加了一个判断,并且将代码简化了一下。
  1. @echo off&setlocal enabledelayedexpansion
  2. :prepare
  3. call :start "1.txt" "2.txt"&type "c.txt"|find "!str!" >nul 2>nul||>>c.txt echo,!str!&&exit
  4. set "str="&goto :prepare
  5. :start
  6. set/a a=0,n=0,u=0
  7. if not "%~1"=="" (
  8.     for /f "tokens=1-2 delims=:" %%i in ('type "%~1"^|find /v /c "" ^&type "%~1"^|findstr -Rn ".*"') do (
  9.         set/a a+=1
  10.         if !a! equ 1 set/a "n=%random%%%%%i"
  11.         if !n! neq 0 (set/a u+=1) else (goto :start)
  12.         if !u! neq 1 if %%i equ !n! set "str=!str!%%j"&shift&goto :start
  13.     )
  14. ) else (
  15.     goto :eof
  16. )
复制代码

作者: 慕夜蓝化    时间: 2015-2-1 10:07

  1. @echo off&setlocal enabledelayedexpansion
  2. :prepare
  3. call :start "1.txt" "2.txt"&type "c.txt"|find "!str!" >nul 2>nul||>>c.txt echo,!str!&&exit
  4. set "str="&goto :prepare
  5. :start
  6. set/a a=0,n=0
  7. if not "%~1"=="" (
  8.     for /f "tokens=1-2 delims=:" %%i in ('type "%~1"^|find /v /c "" ^&findstr -Rn ".*" "%~1"') do (
  9.         set/a a+=1
  10.         if !a! equ 1 set/a n=%random%%%%%i+1
  11.         if !a! neq 1 if %%i equ !n! set "str=!str!%%j"&shift&goto :start
  12.     )
  13. )
复制代码
解决了使用findstr搜索文本时,无法搜索到最后一行的bug。
以及余数未+1的错误,并简化代码。
作者: yimei_0210    时间: 2015-2-2 10:35

回复 10# 慕夜蓝化


好的,我再试试看~~有不明之处会再来请教




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