找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 133761|回复: 43

[文本处理] [已解决]批处理如何查找出文本中字符数最多的行/字符串长度最长的行

[复制链接]
发表于 2015-3-9 10:29:45 | 显示全部楼层 |阅读模式
本帖最后由 慕夜蓝化 于 2020-9-29 17:35 编辑

BAT如何找出文本最大行?
有一小说文本开头部分:

  1.   文本豪客 [url]www.txt.hk[/url] 〓 [url]www.bbzw.net[/url] 拜拜中文

  2.   作品:堕落血天使

  3.   作者:天龙怒吟

  4.   男主角:楚明

  5.   内容简介:

  6.   堕落血天使,是天龙怒吟写的一部西方奇幻小说,主要讲述的是一个中国小鬼学了一身杂七杂八的武功,把各种西方大神揍的满头是包的故事。

  7.   正文

  8.   背景设定

  9.   天使等级的划分
复制代码
要求:
在批处理窗口中直接显示字数最长的行。
比如这一行:

  1. 堕落血天使,是天龙怒吟写的一部西方奇幻小说,主要讲述的是一个中国小鬼学了一身杂七杂八的武功,把各种西方大神揍的满头是包的故事。
复制代码
若具有相同字数的最大行,则全部显示。
比如这两行:

  1.   首先,在没有形成整个世界的时候,创世之神,生命之神,破灭之神从混沌开始初生,三位大神并称为第一代神,也就是最原始的神。
  2.   我们不能说毁灭就是邪恶的,因为,如果没有毁灭,也就没有了创造的意义,就正如没有生命的死亡,这个世界将无限的堆满了人群。
复制代码
求解。
发表于 2015-3-9 11:45:23 | 显示全部楼层
本帖最后由 cobat 于 2015-3-14 09:21 编辑

看11楼和19楼

评分

参与人数 1技术 +1 收起 理由
慕夜蓝化 + 1 我直接拿小说文本测试了,好快。 自已写了 ...

查看全部评分

发表于 2015-3-9 12:29:18 | 显示全部楼层
本帖最后由 pcl_test 于 2015-3-9 12:34 编辑

回复 1# 慕夜蓝化
一般思路,逐行读取逐行统计字符数,并在每行标记上字符数(可用变量存储也可导出到临时文件),以标记的字符数进行排序取得最大值,用findstr "最大值" "文本"获得所有字符数最多的行
求字符串长度方法
http://www.bathome.net/viewthread.php?tid=11799
 楼主| 发表于 2015-3-9 13:07:44 | 显示全部楼层
回复 3# pcl_test

嗯嗯,我去看一下。
主要速度快就成。
发表于 2015-3-9 13:59:45 | 显示全部楼层
回复 4# 慕夜蓝化
另一种思路,先set max=0,逐行读取逐行统计字符数并标记好字符数,同时以辗转比较和赋值max的方式获取到最大值(如第一行字符数为23,23比max初值大,set max=23,第二行字符数为11,比max小,忽略,第三行字符数为40,比max大,set max=40……以此类推),用findstr "最大值" "文本"获得所有字符数最多的行
发表于 2015-3-9 14:19:21 | 显示全部楼层
回复  慕夜蓝化
一般思路,逐行读取逐行统计字符数,并在每行标记上字符数(可用变量存储也可导出到临时文 ...
pcl_test 发表于 2015-3-9 12:29



    那贴的写法我没看懂,意思差不多对.
发表于 2015-3-9 15:36:52 | 显示全部楼层
回复 5# pcl_test


    不用 findstr 也行,设 max 的时候顺便设一个 maxline=%%a 就好
发表于 2015-3-9 16:14:20 | 显示全部楼层
回复 7# CrLf
findstr是考虑max不止一行,而在运行过程中我们都不知道下一行是不是max的一行
发表于 2015-3-9 16:15:42 | 显示全部楼层
回复 8# pcl_test


    那可以这样:
maxline=!maxline!!换行!%%a
 楼主| 发表于 2015-3-9 17:54:00 | 显示全部楼层
如果排除查找相同数的最大行数,第二种应该说最快了。

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3.     for /f "delims=:" %%a in ('(echo,%%i^&echo,^)^|findstr /o "."') do set/a len=%%a-3
  4.     if not defined max set max=!len!
  5.     if !len! geq !max! set max=!len!&set "#=%%i"
  6.     )
  7.     echo,%#%
  8. pause
复制代码

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (堕落血天使.txt) do (
  3.     set/a len=0&set "str=%%i$"
  4.     for %%a in (4096,2048,1024,516,258,126,64,32,16,8,4,2,1) do (
  5.         if not "!str:~%%a!"=="" set/a len+=%%a&set str=!str:~%%a!
  6.     )
  7.     if not defined max set max=!len!
  8.     if !len! geq !max! set max=!len!&set "#=%%i"
  9.     )
  10. echo,%#%
  11. pause
复制代码
发表于 2015-3-9 18:08:52 | 显示全部楼层
本帖最后由 apang 于 2015-3-12 19:51 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. set Lf=^


  3. for /f "delims=" %%a in (a.txt) do (
  4.         set "s=%%a"
  5.         set "Len=0"
  6.         for %%b in (4096 2048 1024 512 256 128 64 32 16) do (
  7.                 if "!s:~%%b!" NEQ "" set /a Len+=%%b & set "s=!s:~%%b!"
  8.         )
  9.         set "s=!s!fedcba9876543210"
  10.         set /a Len+=0x!s:~16,1!
  11.         if !Len! GEQ !Max! (
  12.                 for %%b in (!Len!) do set "_%%b=!_%%b!%%a!Lf!"
  13.                 set "Max=!Len!"
  14.         )
  15. )
  16. echo,!_%Max%!
  17. pause
复制代码
发现 set /a Len+=0x!s:~15,1! 是错误的,改一下,顺便改一下if判断逻辑

评分

参与人数 1技术 +1 收起 理由
慕夜蓝化 + 1 感觉每次都让人大吃一惊的样子,原来还能这 ...

查看全部评分

发表于 2015-3-9 18:18:04 | 显示全部楼层
本帖最后由 apang 于 2015-3-9 18:39 编辑

好像也可以这样:
  1. @set @n=0;// & cscript -nologo -e:jscript "%~0" < a.txt & pause & exit

  2. s = WScript.StdIn.ReadAll() + "\r\n";
  3. ar = s.split("\r\n").sort(function(x,y){return y.length-x.length});
  4. for (i=0; i<ar.length-1; i++) {
  5.         WScript.Echo(ar[i]);
  6.         if (ar[i].length != ar[i+1].length) break;
  7. }
复制代码

评分

参与人数 1技术 +1 收起 理由
慕夜蓝化 + 1 ....哎

查看全部评分

发表于 2015-3-9 19:44:18 | 显示全部楼层
本帖最后由 cobat 于 2015-3-9 19:48 编辑

回复 11# apang


    又学到了,换行符好像可以直接赋值?
发表于 2015-3-9 19:51:31 | 显示全部楼层
回复 13# cobat


    变量表中除了分隔符 00 字符外,其他字符都可以保存到变量中
发表于 2015-3-9 19:55:34 | 显示全部楼层
本帖最后由 cobat 于 2015-3-9 20:02 编辑

回复 14# CrLf


    学习了,频繁的用call有没有问题,延迟变量在标签里是什么情况.不懂的太多了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:06 , Processed in 0.024267 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表