Board logo

标题: [文本处理] [已解决]批处理如何分割大文本到各个文件夹? [打印本页]

作者: daohe    时间: 2013-3-23 16:23     标题: [已解决]批处理如何分割大文本到各个文件夹?

所谓大文本是指: 有几万行的 txt文档。

需要进行如下处理:

从大文本 第一行开始,
每20行分割为一个txt文件, 取名从1.txt, 2.txt,3.txt....到46.txt, 并保存到1文件夹下
然后重复分割另一份的1.txt, 2.txt,到46.txt,保存到2文件夹下,3文件夹,4文件夹 。。。。, 直到把大文本全部分割完


我手头上已经有下面这个,平均分割大文本 到每个小文本文档,供参考
  1. @echo off&setlocal enabledelayedexpansion
  2. set m=1
  3. for /f "delims=" %%i in (result.txt) do (
  4.      set /a n+=1
  5.      if !n! leq 20 echo %%i>>a_!m!.txt
  6.      if !n! equ 20 set n=0&set /a m+=1
  7. )
  8. echo 终于搞定!
  9. pause>nul
复制代码

作者: apang    时间: 2013-3-23 18:18

本帖最后由 apang 于 2013-3-23 19:30 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a s=1,m=1
  3. for /f "delims=" %%a in (a.txt) do (
  4.   set /a "n+=1,1/(n-21)" 2>nul||set /a n=1,m+=1
  5.   if !m!==47 set /a s+=1,m=1
  6.   md !s! 2>nul
  7.   echo,%%a>>!s!\!m!.txt
  8. )
  9. pause
复制代码
vbs,速度比bat快很多。实测10000行文本,vbs用时4秒5,bat用时12秒8
  1. Set FSO = CreateObject("Scripting.FileSystemObject")
  2. Set File = FSO.OpenTextFile("a.txt",1)
  3. s = 1 : m = 1
  4. Do Until File.atEndOfStream
  5.    Str = File.ReadLine
  6.    n = n + 1
  7.    If n = 21 Then m = m + 1 : n = 1
  8.    If m = 47 Then s = s + 1 : m = 1
  9.    If Not FSO.FolderExists(s) Then FSO.CreateFolder(s)
  10.    FSO.OpenTextFile(s & "\" & m & ".txt",8,True).WriteLine Str
  11. Loop
  12. MsgBox "OK"
复制代码

作者: CrLf    时间: 2013-3-23 18:59

最长的单行大概有多长?
作者: apang    时间: 2013-3-23 23:30

本帖最后由 apang 于 2013-3-23 23:42 编辑

减少写文件次数,10000行的TXT文本,用时0.42秒
  1. Set FSO = CreateObject("Scripting.FileSystemObject")
  2. Set File = FSO.OpenTextFile("a.txt",1)
  3. s = 1 : m = 1
  4. Do Until File.atEndOfStream
  5.    n = n + 1
  6.    Str = Str & File.ReadLine & vbCrLf
  7.    If n = 20 Then
  8.       If Not FSO.FolderExists(s) Then FSO.CreateFolder(s)
  9.       FSO.OpenTextFile(s & "\" & m & ".txt",2,True).Write Str
  10.       m = m + 1 : n = 0 : str = ""
  11.    End If
  12.    If m > 46 Then s = s + 1 : m = 1
  13. Loop
  14. If Str <> "" Then
  15.    If Not FSO.FolderExists(s) Then FSO.CreateFolder(s)
  16.    FSO.OpenTextFile(s & "\" & m & ".txt",2,True).Write Str
  17. End If
  18. MsgBox "OK"
复制代码

作者: daohe    时间: 2013-3-24 09:15

回复 2# apang


    非常感谢, 可以使用。
作者: daohe    时间: 2013-3-24 09:15

回复 3# CrLf


    文本一行有一百到几百个单词吧




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