[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
有了5楼代码的基础,要完美解决你的问题,就是很简单的事了,
暂时没空,等会给你代码。。。
技术问题请到论坛发帖求助!

TOP

看来问题不是我想的那么简单。
split 不知道是如何控制文件大小的,我的a.txt内容全是时间这两个字,按说无法分割成 99k的文件才对啊?我分别测试分割成 99k 和 100k 发现文件每行的长度是一样的,只是行数不同,真奇怪?如果是通过控制回车的数量,那么行的长度应该不一样才对啊?

但如何楼主要求的是
“每篇文档只要求不超过100k,结尾需要以中文句号、英文句号或中英文问号结束,以显文档的相对完整”
倒不是没有解决办法,可以用split把文件分割成99k的文件,然后再在每个文件末尾追加一个半角句号就可以了。 不知道这样能否满足楼主要求?
至于文件名的问题则不是问题。。。
另外如果不用第三方软件来作的话,
首先文件内容中的特殊字符就是一个大问题,
其次效率将会是慢的惊人的。!!!
并且不能保证都是以100k来分割文件,只能保证不高与100k
所以建议还是用第三方软件好。
不知楼主意下如何?
技术问题请到论坛发帖求助!

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1 1 20) do set "bu=ZZZZZZZZZZ!bu!"
  3. set/p file=请把要处理的文件拖到此处:
  4. for /f "delims=" %%a in ("%file:"=%") do (
  5.    if not exist "%%~na" md "%%~na"
  6.    split  -b 99k "%file:"=%" "%%~na\%%~na_"
  7.    set "var=%%~na"
  8. )
  9. for /f "tokens=1* delims=_" %%a in ('dir/b/a-d "%var%"') do (
  10.    echo 。>>"%var%\%%a_%%b"
  11.    set "%%b=%%b!bu!"
  12.    set "paixu.!%%b:~0,200!=%%b"
  13. )
  14. for /f "tokens=2 delims==" %%a in ('set paixu.') do (
  15.    set /a n+=1
  16.    ren "%var%\%var%_%%a" "%var%_!n!.txt"
  17. )
  18. start "" "%var%"
复制代码

[ 本帖最后由 随风 于 2008-10-9 17:48 编辑 ]
技术问题请到论坛发帖求助!

TOP

我测试可以啊???
技术问题请到论坛发帖求助!

TOP

你把要处理的文件和批处理放在同一个文件夹里试试
技术问题请到论坛发帖求助!

TOP

不用第三放软件还真是有点吃力。
初步测试成功
   以中文句号结尾。
   文件大小基本不大于100 k (可自行修改 set /a n=101600 数值的大小)
缺点:
   1、效率低 样本文件 2.22m  耗时: 0 小时 1 分钟 3 秒 28 毫秒
   2、文件内容不能含有特殊符号
        如:英文的 " %^&<>()!&  大概就这几个,不一定全是,但肯定有。。。
  为提高效率创建了一个临时文件 tmp.txt (完成后会自动删除)
:
  1. @echo off
  2. set /a n=101600,kb=n
  3. set "临时文件=tmp.txt"
  4. set /p file=请把要处理的文件拖到此处:
  5. set "file=%file:"=%"
  6. cls&echo  正在分割 %file% 文件请稍候。。。
  7. for /f "delims=" %%a in ("%file%") do set wjm=%%~na
  8. findstr /no ".*" "%file%">"%临时文件%"
  9. for /f "tokens=2 delims=:" %%a in ('find /c /v "" "%临时文件%"') do set /a z=%%a
  10. if not exist "%wjm%\" md "%wjm%"
  11. :list
  12. set /a x+=1
  13. if defined t >>"%wjm%\%wjm%_%x%.txt" echo %t%
  14. set "t="
  15. if not defined h (set skip=) else (set skip=skip=%h%)
  16. setlocal enabledelayedexpansion
  17. for /f "%skip% tokens=1,2* delims=:" %%a in (%临时文件%) do (
  18.    if %%b geq !kb! set /a kb+=n&set flag=a&goto loop
  19.    set /a g+=1
  20.    set !g!=%%c&set /a h=%%a,u=%%a
  21. )
  22. :loop
  23. if not defined flag (
  24.    if defined t >>"%wjm%\%wjm%_%x%.txt" echo %t%
  25.    for /l %%a in (1 1 !g!) do >>"%wjm%\%wjm%_%x%.txt" echo.!%%a!
  26.    goto end
  27. )
  28. set "var=!%g%!"
  29. if not defined var set /a g-=1,h-=1&goto loop
  30. for /f "tokens=1* delims=。" %%a in ("!var!") do (
  31.    if "!var!"=="%%a" set /a g-=1,h-=1&goto loop
  32.    if not "%%b"=="" set "t=%%b"
  33.    set w=%%a。
  34. )
  35. for /l %%a in (1 1 !g!) do >>"%wjm%\%wjm%_%x%.txt" echo.!%%a!
  36. >>"%wjm%\%wjm%_%x%.txt" echo !w!
  37. endlocal&set h=%h%&set t=%t%&set kb=%kb%&set "u=%u%"
  38. if %u% neq %z% goto list
  39. :end
  40. del/q "%临时文件%" 2>nul
  41. start "" "%wjm%"
复制代码

[ 本帖最后由 随风 于 2008-10-10 06:06 编辑 ]
技术问题请到论坛发帖求助!

TOP

Re 37楼
文件大小为100 k 应该是纯属巧合,(不过似乎也太巧了点)
第二个文件过大的原因是因为第一个文件的最后一行太长的缘故。

代码运行原理如下:
set /a n=101600   
102400 为100k 这里特意取了一个偏小的植,目的是为了防止文件大于100 k (若文件还是太大,可将此
值再改小)
findstr /o 可以在文件的每行显示前面文件的字节数(既:大小)当此值大于101600 时,则开始准备分

割文件。
先判断此时的最后一行是否含有 句号,若没有则再判断上一行,直到发现句号为止。
再将此行第一个句号的前面部分作为这个文件的结尾,后面的部分作为下一个文件的开头。
若是此行太长的话,那么写入下一行开头的内容就会越多,所以就有可能导致下一个文件过大。
解决办法是减小   set /a n=101600 值,但这样会导致其他文件的会偏小。

不过 37 楼 Batcher 巡查 说的也没错,我在36楼以明确说明 (可自行修改 set /a n=101600 数值的大

小)你若仔细看了话,
应该自己先试一试,不要过于依赖别人现成的代码。

[ 本帖最后由 随风 于 2008-10-10 14:09 编辑 ]
技术问题请到论坛发帖求助!

TOP

返回列表