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

[文本处理] 批处理如何将目录行索引切分为目录列索引

本帖最后由 pan528 于 2013-6-1 11:12 编辑

材料条件和要求:
1、目录行索引是不断增加的,因此是不确定;
2、考虑通用性,目录列也是可调整的,有一定范围的,如3-15列中的一个。

可能的问题:
1、一定的目录行索引切分为指定的目录列索引,可能不被整除。即需要补空格才能使各列对齐;
2、从阅读习惯上看,对最后一列补齐比较符合一般情况。但:
34行切成11列、28行切成9列、12行切成5列等等情形,光补最后一列就会成为空列。这时就要采用补齐其他列的方法来对齐 ...

材料举例:
目录行索引
  1. 最高人民法院公报
  2. 1985年
  3.  第01期
  4.  第02期
  5.  第03期
  6.  第04期
  7. 1986年
  8.  第01期
  9.  第02期
  10.  第03期
  11.  第04期
  12. 1987年
  13.  第01期
  14.  第02期
  15.  第03期
  16.  第04期
  17. 1988年
  18.  第01期
  19.  第02期
  20.  第03期
  21.  第04期
  22. 1989年
  23.  第01期
  24.  第02期
  25.  第03期
  26.  第04期
复制代码
目录列索引(切分为五列)

最高人民法院公报                1986年                         第01期                         第02期                         第03期       
1985年                         第01期                         第02期                         第03期                         第04期       
 第01期                         第02期                         第03期                         第04期       
 第02期                         第03期                         第04期                        1989年
 第03期                         第04期                        1988年                         第01期       
 第04期                        1987年                         第01期                         第02期       



目录列索引(切分为三列)
  1. 最高人民法院公报  第03期  第02期
  2. 1985年  第04期  第03期
  3.  第01期 1987年  第04期
  4.  第02期  第01期 1989年
  5.  第03期  第02期  第01期
  6.  第04期  第03期  第02期
  7. 1986年  第04期  第03期
  8.  第01期 1988年  第04期
  9.  第02期  第01期
复制代码
目录列索引(切分为五列12/5的特殊情形)
最高人民法院公报                 第02期                        1986年                         第02期                         第04期       
1985年                         第03期                         第01期                         第03期                        1987年
 第01期                         第04期

这种情况只有最后行才有吧
你想什么样目的  实在没理解

再说不被整除总是有空列的啊

TOP

回复 2# terse

把目录行索引切分为目录列索引,就是把一列的索引切成多列的索引,目的是使索引占用页面空间更小,更便于阅读。
可能出现多种情形。
为了讨论方便,设总行数=k,切分列数=c,每列行数=x=k/c
切分后无非出现这几种情形:
1、k/c=整数,不用添加空格,按x列直接导出索引即可;
2、k/c≠整数,即有余数,这有二种情形:
1)c<x,可直接在最后一列补空格,使每列对齐,这符合一般的阅读习惯,这种情形是绝大多数;
2)c≥x,如34行切成11列,34/11=3,余3。
这时c=x,排列时,前三列每列四行,其余8列只能每列三行另加一外空格才对齐。如果空格补在最后的列,最后二列就成了空列,看起来就少了二列,或者说只有9列了。
因此,c≥x,如果空都补在后面,也可能出现最后二列,甚至更多列都为空。不只是“最后行才有”。

TOP

貌似是这样:
  1. @echo off
  2. set /a 列数=5,列宽=32
  3. %1 %0 :|more /t%列宽% >b.txt&pause&exit
  4. for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
  5. (for /f "delims=" %%a in (a.txt) do (
  6.    set str=%%a
  7.    setlocal enabledelayedexpansion
  8.    set /p=!str!%tab%
  9.    endlocal
  10.    set /a n+=1,n%%=列数,n/n||echo;
  11. ))<nul 2>nul
复制代码

TOP

回复 4# CrLf

谢谢回贴。但,这个代码有二点不是完全符合我的要求:
1、不是横排生成列,要竖排,顺序要先排第一列,再排第二列 ... 这样才比较符合阅读习惯,如下图:

以复杂一些的索引实例,会准确一些的表达我的意图。

2、不能整除,空格最好添加在最后一列,如上图。遇到特殊情形,才考虑在余数列的最后添加一个空格。

TOP

汗  终于有点明白 楼主的意图  如是这样 缺失部分 空在右边?

TOP

要使排版整齐
方案1 插人跳格 但行字符相差数 且中文 数字混合
方案2 找出最长字符行 按此行字符数排列  也有 中文 数字混合 干扰
方案3 找出最长字节行 按此行字节数排列

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set /a 列数=3,列宽=32
  3. %1 %0 :|more /t%列宽% >b.txt&pause&exit
  4. for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
  5. (for /f "delims=" %%a in (a.txt) do set /a n+=1&set /p ar[!n!]=)<a.txt
  6. set /a 行数=(n+列数-1)/ 列数
  7. for /l %%a in (1 1 %行数%) do (
  8. set "str="
  9. for /l %%b in (%%a %行数% %n%) do (
  10. set "str=!str!!ar[%%b]!%tab%"
  11. )
  12. echo;!str!
  13. )
复制代码

TOP

本帖最后由 pan528 于 2013-6-2 09:46 编辑

回复 8# CrLf

谢谢,这个代码解决了竖排和“c<x”的问题,但:
1、c≥x时,如34行切成11列,就会出现空列。
2、最后一列的空格是多余的,如果在网页显示上会被挤出一列,即多出一个空列,因此,最好能在最后一列不加空格。

TOP

头绪比较乱,找不到合适的数学模型,坐等高人

TOP

做目录索引是为了更方便快捷的的查找定位,排成这样感觉比原始的还不直观。数据多点比一列下来还难找。
关于最后一列的TAB被扩展的问题是否这样理解:
引自8楼Crlf代码:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a 列数=3,列宽=32
  3. %1 %0 :|more /t%列宽% >$&(for /f "tokens=*" %%a in ($) do echo %%a)>b.txt&del $&exit
  4. for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
  5. (for /f "delims=" %%a in (a.txt) do set /a n+=1&set /p ar[!n!]=)<a.txt
  6. set /a 行数=(n+列数-1)/ 列数
  7. for /l %%a in (1 1 %行数%) do (
  8.         set "str="
  9.         for /l %%b in (%%a %行数% %n%) do (
  10.                 set "str=!str!%tab%!ar[%%b]!"
  11.         )
  12.         echo;!str!
  13. )
复制代码
话说回来了,set /a 行数=(n+列数-1)/ 列数
这句太牛了,数学没及格过的人飘过......
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

for 放在下面 可以省掉临时文件

TOP

回复 11# xxpinqz

谢谢!你这个代码又进了一步,最后一列的空格被取消了。但:
当c≥x时,如34行切成11列、12行切成5列,就会出现空列。

切分涉及到一些数学问题。
我想这里还有是采用二分法还是三分法的问题。

数学问题我不是很懂,可否这样考虑:
设总行数=k,切分列数=c,每列行数=x=k/c,余数=y
切分后无非出现这几种情形:
1、k/c=整数,不用添加空格,按x列直接导出索引即可;
2、k/c≠整数,即有余数,这有二种情形:
1)c<x,可直接在最后一列补空格,使每列对齐,这符合一般的阅读习惯,这种情形是绝大多数;
2)c≥x,如34行切成11列,34/11=3,余3。
这时c=x,排列时,前三列每列四行,其余8列只能每列三行另加一外空格才对齐。如果空格补在最后的列,最后二列就成了空列,看起来就少了二列,或者说只有9列了。

如果切分用二分法:
即:
k/c=整数时,直接切分。
k/c≠整数时,c-y列直接切分,y列每列加一空行。

如果切分用三分法:
即:
k/c=整数时,直接切分。
c<x时,直接在最后一列补空格。
c≥x时,c-y列直接切分,y列每列加一空行。

二分法切分要简单一些,三分法实际把“c≥x”作为特殊情况,另分一次。
因为特殊情况很少,所以三分法会更符合阅读习惯。

TOP

楼主到底想要什么 我理解问题吗
是想余数为0吗?
不要说2分 N分
能简单举几个例及你认为的特殊情况 怎么排列最好 你最后的理想结果是什么

TOP

如你所说 34行切成11列 在你看来特殊的
那你理想排列是怎样的呢
  1. 1行 5行  9行 13行 17行 21行 25行 29行 33行
  2. 2行 6行 10行 14行 18行 22行 26行 30行 34行
  3. 3行 7行 11行 15行 19行 23行 27行 31行
  4. 4行 8行 12行 16行 20行 24行 28行 32行
复制代码

TOP

返回列表