返回列表 发帖

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

本帖最后由 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期

回复 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

回复 4# CrLf

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

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

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

TOP

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

回复 8# CrLf

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

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

回复 15# terse

我想要的是一个切分程序,总行数和要切分的列数是不定的,这样程序就有通用性。
我想这个程序首先要解决数学问题,我在一楼、三楼、十三楼分别说到了一些。如果要枚举,我在一楼已举了三个例子。其中“切分为五列”在最后一列补空,是比较符合阅读习惯的方法。其实,这个例子也可以从第二列开始,每列补一个空。如果对所有不能整除的总行数,只采用“每列补一个空”的方法,我称它为“二分法”,如果只对特殊情形“c≥x”(切分的列大于或等于切分后每列的行数)时,才用这种方法,其他的只在最后一列补空,我称它为“三分法”。

再说特殊例子:34行切成11列。
如果对这个例子只对最后一列补空行,就会成为你所列的情况。即:只能看到九列,其他二行不见了!这就是特殊情形!
对这种情况要分成十一列,只能采用对所有不能整除的总行数,用“每列补一个空”的方法来完成!

如下:
1行 5行  8行 11行 14行 17行 20行 23行 26行 29行 32行
2行 6行  9行 12行 15行 18行 21行 24行 27行 30行 33行
3行 7行 10行 13行 16行 19行 22行 25行 28行 31行 34行
4行

我的表达不标准,不知道你听明白了没有?

TOP

回复 17# xxpinqz

请原谅,是我粗心。
“这时c=x,排列时,前三列每列四行,其余8列只能每列三行另加一外空格才对齐。”这句算错了。
应为:“这时c=x,排列时,前一列每列四行,其余10列只能每列三行另加一外空格才对齐。”

TOP

回复 21# xxpinqz
谢谢!终于有了三分法的切分程序。
慢慢消化,学习学习。

TOP

回复 20# terse

是一个二分法的切分程序。
通过了34/11的情况,但 34/4时,就出错了,第三列和第四列顺序都出错了,结果如下:
1               10              23              31
2               11              24              32
3               12              25              33
4               13              26              34
5               14              19              27
6               15              20              28
7               16              21              29
8               17              22              30
9               18

TOP

本帖最后由 pan528 于 2013-6-5 20:46 编辑

回复 26# terse

测试通过!代码挺精炼的。如果能改成三分法就更完美了。谢谢!

能解释一下,下面代码的含义吗?

for /f "delims=U" %%a in ('cmd /u /c echo 唉') do

TOP

回复 29# terse

三分法就是:在上面二分法的基础上,对切分列数小于每列行数的情形,用另一种方法排列,即把所有空格放在最后一列。
比如:
二分法:
1        10        19        27
2        11        20        28
3        12        21        29
4        13        22        30
5        14        23        31
6        15        24        32
7        16        25        33
8        17        26        34
9        18
三分法
1    10   19   28
2    11   20   29
3    12   21   30
4    13   22   31
5    14   23   32
6    15   24   33
7    16   25   34
8    17   26
9    18   27

TOP

回复 31# terse

二十一楼就是三分法。

TOP

回复 33# xxpinqz

是这个意思。但我没有按写程序的方式来表达,让你费心了。请原谅。

TOP

回复 35# terse


我试了一下,26楼的代码只能二分法,21楼的代码是三分法。

TOP

回复 41# terse

测试通过!是三分法。不过最后多了一个回车,不知问题出在哪?

TOP

返回列表