[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 随机提取文件中指定数量的行

  在其他论坛看到了这个帖子,觉得随机提取文本内容的话题还有继续挖掘的价值,就发到这里来了,看看大家能想到多少种方案。因为发这个帖的目的并不是为了得到答案,而是想看看到底有多少种方案,所以,回帖的时候,请大家大致说一下自己的思路:
例如一个文本 1.txt.共有N 行,N 大概是几千
========
24.123.0.0 24.131.14.255
24.136.0.0 24.137.1.255
24.140.0.0 24.140.4.255
24.142.0.0 24.145.0.255
24.147.0.0 24.155.11.255
24.158.0.0 24.199.12.255
... ...
... ...
47.80.130.0 47.83.130.255
47.92.1.0 47.92.1.255
47.100.234.0 47.104.234.255
47.112.48.0 47.113.48.255
47.140.81.0 47.143.81.255
47.162.4.0 47.162.4.255
47.164.33.0 47.164.33.255
========

我想随机从文本中提取10行 输出到2.txt里面


补充内容:
--------------------------------------------------------------------
  因为是想让大家提供更多的思路,所以这个题目降低一下难度,做如下限制:
  1、不存在|、&、!等各种特殊字符;
  2、不存在空行;
  3、行首不存在冒号;
  4、每行字符串长度不超过8100字节;
  5、可以生成临时文件
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

1、允许任何人回帖吗?
2、允许创建临时文件吗?
3、文本中有空行吗?

[ 本帖最后由 随风 于 2009-3-21 18:19 编辑 ]
技术问题请到论坛发帖求助!

TOP

随机? 提取前10行算随机吗?~
心绪平和,眼藏静谧。

TOP

VBS
  1. Dim Fso,File
  2. Set Fso = CreateObject("Scripting.FileSystemObject")
  3. Set File = Fso.OpenTextFile("Test.txt")
  4. File.ReadAll
  5. B=File.Line
  6. File.Close
  7. Randomize
  8. N=Fix(Rnd*B)
  9. Set File = Fso.OpenTextFile("Test.txt")
  10. For i = 1 to N - 1
  11.     File.ReadLine
  12. Next
  13. aLine = File.ReadLine
  14. File.Close
  15. Wscript.Echo "随机第" & N &"行" & vbCrLf & vbCrLf & aLine
  16. Set Fso=Nothing
  17. Set File=Nothing
复制代码

TOP

我够粗心的要随机10行,不过要10个随机不重复行有点麻烦
  1. Dim Fso,File
  2. Set Fso = CreateObject("Scripting.FileSystemObject")
  3. Do
  4.     Counter = Counter + 1
  5.     If Counter = 11 Then
  6.       Exit Do
  7.     End If
  8. Set File = Fso.OpenTextFile("Test.txt")
  9. File.ReadAll
  10. B=File.Line
  11. File.Close
  12. Randomize
  13. N=Fix(Rnd*B)
  14. Set File = Fso.OpenTextFile("Test.txt")
  15. For i = 1 to N - 1
  16.     File.ReadLine
  17. Next
  18. aLine = File.ReadLine
  19. File.Close
  20. Lines = Lines & "随机第" & N &"行内容:" & aLine & vbCrLf
  21. Loop
  22. Wscript.Echo Lines
  23. Set Fso=Nothing
  24. Set File=Nothing
复制代码

TOP

原帖由 随风 于 2009-3-21 18:17 发表
1、允许任何人回帖吗?
2、允许创建临时文件吗?
3、文本中有空行吗?

  任何人都可以回帖;允许创建临时文件——只要能解决问题,方法不限;不存在空行;允许提取到重复行。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

汗,看错题了,我以为是提取指定的行。。
技术问题请到论坛发帖求助!

TOP

回复 6楼 的帖子

我想那个提问的人原意可能是不重复的随机10行吧?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

思路:
  创建临时文件,适合超大文本。(若文本不大可将findstr语句放入for中取消临时文件)
  思路很简单,却不知怎么用文字来表达,汗,没文化就是不行。。
  核心代码就是findstr那一句,不难理解,各位自己看吧。
:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a n=10
  3. for /f "tokens=2 delims=:" %%a in ('find /v /c "" a.txt')do set/a h=%%a
  4. for /l %%a in (1 1 %h%) do set .!random!!random!=%%a
  5. for /f "tokens=2 delims==" %%a in ('set .') do (
  6.    set /a m+=1
  7.    if !m! leq %n% set var=!var! %%a:
  8. )
  9. findstr /n .* a.txt|findstr /b "%var%">tem
  10. for /f "tokens=1* delims=:" %%a in (tem) do echo %%b
  11. pause
复制代码
技术问题请到论坛发帖求助!

TOP

  我把这个题拿到我们论坛里来的目的,是想看看大家能想到哪些办法提取到随机的指定数目的行,所以降低了难度,不强制要求取不同的行,如果有愿意挑战一下的,也可以提取不重复的行。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

findstr 不是有/n的么,每行内容保存到line_n变量里,然后随机n就好了。。。

TOP

原帖由 defanive 于 2009-3-21 22:41 发表
findstr 不是有/n的么,每行内容保存到line_n变量里,然后随机n就好了。。。

  一想到会有大量的变量产生,心里就不舒坦。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

在总行数不多的前提下,我认为变量赋值法是可取的:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do set "_!random!=%%a"
  3. for /f "tokens=2 delims==" %%a in ('set _') do (
  4.      set /a n+=1&echo %%a
  5.      if !n! equ 10 goto next
  6. )
  7. :next
  8. pause>nul
复制代码
***共同提高***

TOP

回复 13楼 的帖子

那个提问的朋友在CN-DOS也发了这个帖子,呵呵。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表