标题: [文本处理] 随机提取文件中指定数量的行 [打印本页]
作者: namejm 时间: 2009-3-21 16:12 标题: 随机提取文件中指定数量的行
在其他论坛看到了这个帖子,觉得随机提取文本内容的话题还有继续挖掘的价值,就发到这里来了,看看大家能想到多少种方案。因为发这个帖的目的并不是为了得到答案,而是想看看到底有多少种方案,所以,回帖的时候,请大家大致说一下自己的思路:
例如一个文本 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、可以生成临时文件
作者: 随风 时间: 2009-3-21 18:17
1、允许任何人回帖吗?
2、允许创建临时文件吗?
3、文本中有空行吗?
[ 本帖最后由 随风 于 2009-3-21 18:19 编辑 ]
作者: pusofalse 时间: 2009-3-21 18:19
随机? 提取前10行算随机吗?~
作者: fastslz 时间: 2009-3-21 19:00
VBS
- Dim Fso,File
- Set Fso = CreateObject("Scripting.FileSystemObject")
- Set File = Fso.OpenTextFile("Test.txt")
- File.ReadAll
- B=File.Line
- File.Close
- Randomize
- N=Fix(Rnd*B)
-
- Set File = Fso.OpenTextFile("Test.txt")
- For i = 1 to N - 1
- File.ReadLine
- Next
- aLine = File.ReadLine
- File.Close
- Wscript.Echo "随机第" & N &"行" & vbCrLf & vbCrLf & aLine
- Set Fso=Nothing
- Set File=Nothing
复制代码
作者: fastslz 时间: 2009-3-21 19:23
我够粗心的要随机10行,不过要10个随机不重复行有点麻烦
- Dim Fso,File
- Set Fso = CreateObject("Scripting.FileSystemObject")
-
- Do
- Counter = Counter + 1
- If Counter = 11 Then
- Exit Do
- End If
- Set File = Fso.OpenTextFile("Test.txt")
- File.ReadAll
- B=File.Line
- File.Close
- Randomize
- N=Fix(Rnd*B)
-
- Set File = Fso.OpenTextFile("Test.txt")
- For i = 1 to N - 1
- File.ReadLine
- Next
- aLine = File.ReadLine
- File.Close
- Lines = Lines & "随机第" & N &"行内容:" & aLine & vbCrLf
- Loop
- Wscript.Echo Lines
-
- Set Fso=Nothing
- Set File=Nothing
复制代码
作者: namejm 时间: 2009-3-21 19:45
原帖由 随风 于 2009-3-21 18:17 发表
1、允许任何人回帖吗?
2、允许创建临时文件吗?
3、文本中有空行吗?
任何人都可以回帖;允许创建临时文件——只要能解决问题,方法不限;不存在空行;允许提取到重复行。
作者: 随风 时间: 2009-3-21 20:01
汗,看错题了,我以为是提取指定的行。。
作者: Batcher 时间: 2009-3-21 20:19 标题: 回复 6楼 的帖子
我想那个提问的人原意可能是不重复的随机10行吧?
作者: 随风 时间: 2009-3-21 20:23
思路:
创建临时文件,适合超大文本。(若文本不大可将findstr语句放入for中取消临时文件)
思路很简单,却不知怎么用文字来表达,汗,没文化就是不行。。
核心代码就是findstr那一句,不难理解,各位自己看吧。
:- @echo off&setlocal enabledelayedexpansion
- set /a n=10
- for /f "tokens=2 delims=:" %%a in ('find /v /c "" a.txt')do set/a h=%%a
- for /l %%a in (1 1 %h%) do set .!random!!random!=%%a
- for /f "tokens=2 delims==" %%a in ('set .') do (
- set /a m+=1
- if !m! leq %n% set var=!var! %%a:
- )
- findstr /n .* a.txt|findstr /b "%var%">tem
- for /f "tokens=1* delims=:" %%a in (tem) do echo %%b
- pause
复制代码
作者: namejm 时间: 2009-3-21 20:26
我把这个题拿到我们论坛里来的目的,是想看看大家能想到哪些办法提取到随机的指定数目的行,所以降低了难度,不强制要求取不同的行,如果有愿意挑战一下的,也可以提取不重复的行。
作者: defanive 时间: 2009-3-21 22:41
findstr 不是有/n的么,每行内容保存到line_n变量里,然后随机n就好了。。。
作者: namejm 时间: 2009-3-21 22:59
原帖由 defanive 于 2009-3-21 22:41 发表
findstr 不是有/n的么,每行内容保存到line_n变量里,然后随机n就好了。。。
一想到会有大量的变量产生,心里就不舒坦。
作者: zqz0012005 时间: 2009-3-22 12:28
我还以为那个作者又是一帖多发。
http://bbs.verybat.org/viewthread.php?tid=16624&page=1&fromuid=37#pid171532
作者: batman 时间: 2009-3-25 08:21
在总行数不多的前提下,我认为变量赋值法是可取的:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do set "_!random!=%%a"
- for /f "tokens=2 delims==" %%a in ('set _') do (
- set /a n+=1&echo %%a
- if !n! equ 10 goto next
- )
- :next
- pause>nul
复制代码
作者: Batcher 时间: 2009-3-25 09:51 标题: 回复 13楼 的帖子
那个提问的朋友在CN-DOS也发了这个帖子,呵呵。
作者: namejm 时间: 2009-3-25 10:57
从其他地方看到的代码,使用到了 sort /+n ,思路很巧妙:- @echo off&setlocal enabledelayedexpansion
- :a
- set /a n1=%random%%%25+1
- set n2=0
- for /f "tokens=*" %%a in ('sort /+%n1% 1.txt') do (
- set /a n2+=1
- if !n2! gtr 10 goto jieshu
- echo %%a
- )
- :jieshu&pause&goto a
复制代码
作者: keen 时间: 2009-6-2 15:54
more也可以,就是要产生临时文件:- @echo off
- :lp
- set /a m+=1
- if %m% equ 10 del /q tmp&pause&exit/b
- set /a n=%random%%%12+1
- (more +%n% 1.txt)>tmp
- set /p str=<tmp
- echo %str%
- goto lp
复制代码
作者: netbenton 时间: 2009-6-2 20:07
在 [ 随风] 的基础上改了一下,做到不重复,完全随机(16楼sort方法,有些行是永远也取不到的),不生成临时文件-
- @echo off&setlocal enabledelayedexpansion
- set /a n=10
- for /f "tokens=2 delims=:" %%a in ('find /v /c "" a.txt')do set/a h=%%a
-
- for /l %%a in (1,1,%n%) do (
- set/a v=!random!%%h+1
- for /l %%b in (1,1,%n%) do (
- if defined tem!v! (set /a v=v%%n+1)
- )
- set tem!v!=y
- set var=!var! !v!:
- )
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt^|findstr /b "!var!"') do echo %%b
- pause
复制代码
[ 本帖最后由 netbenton 于 2009-6-2 20:09 编辑 ]
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |