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

[文本处理] [已解决]请问批处理,第一个非0前面的0如何消除?

0,1组合
组合=结果求解
文本  1.txt
00
01
10
11

文本  3.txt
000
001
010
011
100
101
110
111

00=0
01=1
10=10
11=11

000=0
001=1
010=10
011=11
100=100
101=101
110=110
111=111

0~9与0~9数字组合,形成的前面有0,
+    0,1,2,3,4,5,6,7,8,9,
0,00,01,02,03,04,05,06,07,08,09,
1,10111213141516171819
2,21
3,
4,
5,
6,
7,
8,
9,
按照十进制非0数字,前面有0的省略。那么同理,在01组合里,将一行里第一个1前面为0的消除,全0的留一个0。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 aloha20200628 于 2024-9-8 13:37 编辑

回复 1# zzz19760225
  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "tokens=* delims=0" %%a in (test.txt) do (
  3. set "n=%%a"
  4. if not defined n (echo,0) else if "!n:~0,1!"=="=" (echo,0!n!) else echo,!n!
  5. )
  6. for %%n in (00,01,02,03,04,05,06,07,08,09,) do (
  7. set "n=" &for /f "tokens=* delims=0" %%a in ("%%n") do set "n=%%a"
  8. if defined n (set "sn=!sn!!n!,") else set "sn=!sn!0,"
  9. )
  10. echo,!sn!
  11. endlocal&pause&exit/b
复制代码

以上代码第二行要读取的 test.txt 内容如下:
00
01
10
11

000
001
010
011
100
101
110
111

00=0
01=1
10=10
11=11

000=0
001=1
010=10
011=11
100=100
101=101
110=110
111=111

或直接用一楼的 1.txt, 3.txt 读取源文本数据,则可将以上代码第二行的  (test.txt)  改为  (1.txt, 3.txt)  即可
1

评分人数

TOP

本帖最后由 zzz19760225 于 2024-9-12 18:40 编辑

回复 2# aloha20200628

谢谢老师,这部分顺序完成。
20240809
  1. @echo off
  2. :1,开始定义单元,文本1个列的层;
  3. set a0=0
  4. set a1=1
  5.      (
  6.        echo:%a0%
  7.        echo:%a1%
  8.       )> 1.txt
  9. :2,1-2,文本1个列的层,组合为2个列的层;
  10. cd.> 02.txt
  11.     (
  12.     for /f %%b in (1.txt) do (
  13.     for /f %%c in (1.txt) do (
  14.                          echo:%%b%%c
  15.                          ))
  16.      )>> 02.txt
  17. :2,2-2,文本2个组合层的脱0处理;
  18. cd.> 2.txt
  19. setlocal enabledelayedexpansion
  20.        (
  21.        for /f "tokens=* delims=0" %%d in (02.txt) do (
  22.       set "e=%%d"
  23.       if defined e    (echo,!e!) else (echo,0)
  24.           )
  25.        )> 2.txt
  26. endlocal
  27. :3,文本集中
  28. cd.> 0.txt
  29. for /f %%f in (1.txt) do set/p=%%f,<nul >> 0.txt
  30.                                    echo:>> 0.txt
  31. for /f %%f in (2.txt) do set/p=%%f,<nul >> 0.txt
  32.                                    echo:>> 0.txt
  33. pause&exit
复制代码
20240909
  1. @echo off
  2. :1,开始定义单元,文本1个列的层,变量a1输入中间逗号间隔的基本1集合文字符号或数字;
  3. cd.> 1.txt
  4. set a0=0
  5. set a1=1,2
  6.      (
  7.        echo:%a0%
  8.        for %%a in (%a1%) do echo:%%a
  9.       )> 1.txt
  10. :2,1-2,文本1个列的层,组合为2个列的层;
  11. cd.> 02.txt
  12.     (
  13.     for /f %%b in (1.txt) do (
  14.     for /f %%c in (1.txt) do (  echo:%%b%%c))
  15.      )>> 02.txt
  16. :2,2-2,文本2个组合层的脱0处理;
  17. cd.> 2.txt
  18. setlocal enabledelayedexpansion
  19.        (
  20.        for /f "tokens=* delims=0" %%d in (02.txt) do (
  21.       set "e=%%d"
  22.       if defined e   (echo,!e!) else (echo,0) )
  23.        )> 2.txt
  24. endlocal
  25. :3,1-2,文本2个列的层,组合为3个列的层;
  26. cd.> 03.txt
  27.     (
  28.     for /f %%b in (2.txt) do (
  29.     for /f %%c in (1.txt) do (  echo:%%b%%c))
  30.      )>> 03.txt
  31. :3,2-2,文本3个组合层的脱0处理;
  32. cd.> 3.txt
  33. setlocal enabledelayedexpansion
  34.        (
  35.        for /f "tokens=* delims=0" %%d in (03.txt) do (
  36.       set "e=%%d"
  37.       if defined e   (echo,!e!) else (echo,0) )
  38.        )> 3.txt
  39. endlocal
  40. :4,1-2,文本3个列的层,组合为4个列的层;
  41. cd.> 04.txt
  42.     (
  43.     for /f %%b in (3.txt) do (
  44.     for /f %%c in (1.txt) do (  echo:%%b%%c))
  45.      )>> 04.txt
  46. :4,2-2,文本4个组合层的脱0处理;
  47. cd.> 4.txt
  48. setlocal enabledelayedexpansion
  49.        (
  50.        for /f "tokens=* delims=0" %%d in (04.txt) do (
  51.       set "e=%%d"
  52.       if defined e   (echo,!e!) else (echo,0) )
  53.        )> 4.txt
  54. endlocal
  55. :5,1-2,文本4个列的层,组合为5个列的层;
  56. cd.> 05.txt
  57.     (
  58.     for /f %%b in (4.txt) do (
  59.     for /f %%c in (1.txt) do (  echo:%%b%%c))
  60.      )>> 05.txt
  61. :5,2-2,文本5个组合层的脱0处理;
  62. cd.> 5.txt
  63. setlocal enabledelayedexpansion
  64.        (
  65.        for /f "tokens=* delims=0" %%d in (05.txt) do (
  66.       set "e=%%d"
  67.       if defined e   (echo,!e!) else (echo,0) )
  68.        )> 5.txt
  69. endlocal
  70. :0,文本集中
  71. cd.> 0.txt
  72. for /f %%f in (1.txt) do set/p=%%f,<nul >> 0.txt
  73.                                    echo:>> 0.txt
  74. for /f %%f in (2.txt) do set/p=%%f,<nul >> 0.txt
  75.                                    echo:>> 0.txt
  76. for /f %%f in (3.txt) do set/p=%%f,<nul >> 0.txt
  77.                                    echo:>> 0.txt
  78. for /f %%f in (4.txt) do set/p=%%f,<nul >> 0.txt
  79.                                    echo:>> 0.txt
  80. for /f %%f in (5.txt) do set/p=%%f,<nul >> 0.txt
  81.                                    echo:>> 0.txt
  82. pause&exit
复制代码
20240912
  1. @echo off
  2. :1,开始定义单元,文本1个列的层,变量a1输入中间逗号间隔的基本1集合文字符号或数字;
  3. cd.> 1.txt
  4. set "a0=零"
  5. set "a1=一,二"
  6.      (
  7.        echo:%a0%
  8.        for %%a in (%a1%) do echo:%%a
  9.       )> 1.txt
  10. :2,1-2,文本1个列的层,组合为2个列的层;
  11. cd.> 02.txt
  12.     (
  13.     for /f %%b in (1.txt) do (
  14.     for /f %%c in (1.txt) do (  echo:%%b%%c))
  15.      )>> 02.txt
  16. :2,2-2,文本2个组合层的脱0处理;
  17. cd.> 2.txt
  18. setlocal enabledelayedexpansion
  19.        (
  20.        for /f "tokens=* delims=%a0%" %%d in (02.txt) do (
  21.       set "e=%%d"
  22.       if defined e   (echo,!e!) else (echo,%a0%) )
  23.        )> 2.txt
  24. endlocal
  25. :3,1-2,文本2个列的层,组合为3个列的层;
  26. cd.> 03.txt
  27.     (
  28.     for /f %%b in (2.txt) do (
  29.     for /f %%c in (1.txt) do (  echo:%%b%%c))
  30.      )>> 03.txt
  31. :3,2-2,文本3个组合层的脱0处理;
  32. cd.> 3.txt
  33. setlocal enabledelayedexpansion
  34.        (
  35.        for /f "tokens=* delims=%a0%" %%d in (03.txt) do (
  36.       set "e=%%d"
  37.       if defined e   (echo,!e!) else (echo,%a0%) )
  38.        )> 3.txt
  39. endlocal
  40. :4,1-2,文本3个列的层,组合为4个列的层;
  41. cd.> 04.txt
  42.     (
  43.     for /f %%b in (3.txt) do (
  44.     for /f %%c in (1.txt) do (  echo:%%b%%c))
  45.      )>> 04.txt
  46. :4,2-2,文本4个组合层的脱0处理;
  47. cd.> 4.txt
  48. setlocal enabledelayedexpansion
  49.        (
  50.        for /f "tokens=* delims=%a0%" %%d in (04.txt) do (
  51.       set "e=%%d"
  52.       if defined e   (echo,!e!) else (echo,%a0%) )
  53.        )> 4.txt
  54. endlocal
  55. :5,1-2,文本4个列的层,组合为5个列的层;
  56. cd.> 05.txt
  57.     (
  58.     for /f %%b in (4.txt) do (
  59.     for /f %%c in (1.txt) do (  echo:%%b%%c))
  60.      )>> 05.txt
  61. :5,2-2,文本5个组合层的脱0处理;
  62. cd.> 5.txt
  63. setlocal enabledelayedexpansion
  64.        (
  65.        for /f "tokens=* delims=%a0%" %%d in (05.txt) do (
  66.       set "e=%%d"
  67.       if defined e   (echo,!e!) else (echo,%a0%) )
  68.        )> 5.txt
  69. endlocal
  70. :0,文本集中
  71. cd.> 0.txt
  72. for /f %%f in (1.txt) do set/p=%%f,<nul >> 0.txt
  73.                                    echo:>> 0.txt
  74. for /f %%f in (2.txt) do set/p=%%f,<nul >> 0.txt
  75.                                    echo:>> 0.txt
  76. for /f %%f in (3.txt) do set/p=%%f,<nul >> 0.txt
  77.                                    echo:>> 0.txt
  78. for /f %%f in (4.txt) do set/p=%%f,<nul >> 0.txt
  79.                                    echo:>> 0.txt
  80. for /f %%f in (5.txt) do set/p=%%f,<nul >> 0.txt
  81.                                    echo:>> 0.txt
  82. pause&exit
复制代码

TOP

怎么搞得这么复杂,把你的需求详细描述一下,可能不需要这么复杂的代码即可解决。
1

评分人数

TOP

本帖最后由 zzz19760225 于 2024-9-15 18:28 编辑

回复 4# qixiaobin0715
我也不知道能不能语言表达出来(因为我本身就稀里糊涂的,我也不知道清楚的样子是什么):

1基本进制集的单元,开始的文本,人只要在文本里按照规矩输入内容(类似汇编寄存器)。
2基本进制集的初步组合规律,组合的内容输出到文本(汇编寄存器)。
3通用不变组合部分,循环与输出到文本的增量存量内容再组合,循环,形成层级集合(汇总)。
4输入一个需要的层级数,就可以获得这个层级的数字组合内容(前提是在电脑硬件可以承受承载的数量范围)<!重点,观察研究的信息提取!>数字化层数抽取完成 _ qixiaobin0715
5任意字符作为组合单元,形成的试验观察。如汉字作为数量进制的参与观察

初始组合单元0,1,也可以增加的,2,3,4,5......。
0.txt
0
1
或者
0.txt
0
1
2
3
.....
最后可以替换成汉字
0.txt










(至此是一般平常的十进制汉字组合)
(后面就可以观察1,2,3,4,5,6,7,8,9,a的十个数字对齐组合,作为地址数字组合,区别于一般平常数字组合。不用0~9了。一二三四五六七八九十,壹贰叁肆伍陆柒捌玖拾)

循环组合,消0。
+,0,1,
0,
1,
组合出一个带0层级,消0为1个层级集合。

+,00,01,10,11,
0,
1,
组合出一个带0层级,消0为1个层级集合。

+,000,001,010,011,100,101,110,111,
0,
1,
组合出一个带0层级,消0为1个层级集合。

假设有开关可以无限自动循环下去,在这个无限开关中设置有限条件。
在有限条件开关里,数量层级下的所有带0和消0层级集成为金字塔两座(观察其规律是有形的),以及可以抽取其中任意一个层级的内容。



组合的金字塔形式与一体形式
0,1,
00,01,
10,11,
000,001,010,011,
100,101,110,111,
一个层面不包括上一个层面,每个层面是独立的,相对关系类似一个金字塔。
0,1,2,3,4,5,6,7,8,9,
10,11,12,13,14,15,16,17,18,19,
......
90,91,92,93,94,95,96,97,98,99,
缩位一体,上一层级的数字内容0~9,是10~99的一个补充,数量层级组合起来是一体的。而0~9层级和10~99层级的内容,又是下一数量层级100~999的一体补充。



组合与选择,实现组合,实现选择。
O,一,二,三,四,五,六,七,八,九,十;
零,壹,贰,叁,肆,伍,陆,柒,捌,玖,拾;
0,1,2,3,4,5,6,7,8,9,a;
1,11,12,13,14,15,16,17,18,19,1a;
2,21,22,23,24,25,26,27,28,29,2a;
3,31,32,33,34,35,36,37,38,39,3a;
4,41,42,43,44,45,46,47,48,49,4a;
5,51,52,53,54,55,56,57,58,59,5a;
6,61,62,63,64,65,66,67,68,69,6a;
7,71,72,73,74,75,76,77,78,79,7a;
8,81,82,83,84,85,86,87,88,89,8a;
9,91,92,93,94,95,96,97,98,99,9a;
按照自我需求去布置其定义,组合选择关系就能实现十进制的地址阵列。
不受其外在形式印象影响,按照空间相对关系走,走联系连接圆起来就可以了。破碎形式印象,按需实事求是联系组合选择。




计算机从二进制的,4位,到8位,16位,32位,64位,下次普及的128位......,这些计算机每次硬件置换,要淘汰一批优秀软件。可以复原,但是要进行增减处理。
如果用缩位一体的进制模式,是不是可以随便硬件如何置换位数,在一个通用一体数量数字规律中,老软件是否可以一直使用下去呢?(每一代人的心力劳动,可以随着发展积累,而不被淘汰的假设。如64位上直接使用dos的debug.exe,不需要软件上信息处理,就能使用。假设忽略机器商业技术内容的话,都是通用标准)
(是不是越说越糊涂的感觉,我的表达根源和表达形式都有问题,是个麻烦事情)

TOP

本帖最后由 qixiaobin0715 于 2024-9-12 12:25 编辑

回复 5# zzz19760225
没看明白,不是你的表达有问题,主要是我不懂。你3楼的代码倒是可以简化一下。第一个提示输入你所说的层级数;第二个提示输入的是你所说的“组合单元”,由逗号隔开的数列:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p CombNum=(Input a number. eg. 5):
  4. set /p Col=(Input a sequence of number. eg. 0,1,2):
  5. set Cols=%Col%
  6. set m=10
  7. set n=%CombNum%
  8. echo,%Col%
  9. :a
  10. set /a m*=10
  11. set /a n-=1
  12. set str=
  13. for %%i in (!Col!) do (
  14.     for %%j in (!Cols!) do (
  15.         set n1=%%i%%j
  16.         set n2=1!n1!
  17.         set /a n2-=m
  18.         if defined str (
  19.             set str=!str!,!n1!
  20.             set Line=!Line!,!n2!
  21.         ) else (
  22.             set str=!n1!
  23.             set Line=!n2!
  24.         )
  25.     )
  26. )
  27. echo,!Line!
  28. set Cols=!str!
  29. if !n! gtr 1 goto :a
  30. pause
复制代码
输入内容必须是数字,代码中有数学计算,其它字符不适合。
1

评分人数

    • zzz19760225: 谢谢大侠,正是所需要的之一。技术 + 1

TOP

本帖最后由 qixiaobin0715 于 2024-9-12 13:08 编辑

上面代码有一定的局限性,如果变量Cols长度超过一定限制,会出错,好像是8千多。

TOP

本帖最后由 zzz19760225 于 2024-9-12 13:22 编辑


多谢多谢,老师的代码够用了
这是用于机器重复规律观察研究用的,只用脑子想象,加上生活里的数字数量数学习惯,转弯难度很大。有一定量的规律比较,就达到效果了。
(问题一开始,要是不限定于批处理,也许可以用字符单元组合去实现)

TOP

数字也是字符的一种,只不过纯数字有自己的特性,更容易运用技巧进行处理。只要有迹可循普通字符也可处理,要更麻烦一些。
1

评分人数

    • zzz19760225: 感谢回复。是啊,在我模仿平常一体思路没转 ...技术 + 1

TOP

回复 8# zzz19760225
在6楼代码基础上修改,适合普通字符(包括数字),字符序列分隔符要用英文逗号。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p CombNum=Input a number(eg. 5):
  4. set /p CHSQ=Input a character sequence(eg. a,b,c):
  5. set CHSQs=%CHSQ%
  6. set n=%CombNum%
  7. set FCH=%CHSQ:~,1%
  8. echo,%FCH%
  9. echo,%CHSQ%
  10. :a
  11. set /a n-=1
  12. set str=
  13. for %%i in (!CHSQ!) do (
  14.     for %%j in (!CHSQs!) do (
  15.         set n1=%%i%%j
  16.         if "!n1:%FCH%=!"=="" (
  17.             set n2=%FCH%
  18.         ) else (
  19.             for /f "tokens=* delims=%FCH%" %%k in ("!n1!") do set n2=%%k
  20.         )
  21.         if defined str (
  22.             set str=!str!,!n1!
  23.             set Line=!Line!,!n2!
  24.         ) else (
  25.             set str=!n1!
  26.             set Line=!n2!
  27.         )
  28.     )
  29. )
  30. echo,!line!
  31. set CHSQs=!str!
  32. if !n! gtr 1 goto :a
  33. pause
复制代码
1

评分人数

TOP

本帖最后由 zzz19760225 于 2024-9-13 12:27 编辑
回复  zzz19760225
在6楼代码基础上修改,适合普通字符(包括数字),字符序列分隔符要用英文逗号。
qixiaobin0715 发表于 2024-9-13 12:04



对,就是这个。
如果bat能加一些说明,更好。
谢谢老师的代码

TOP

代码第8行测试时加上的,其它的测试用的都删了,这行忘了。

TOP

本帖最后由 qixiaobin0715 于 2024-9-13 16:24 编辑

10楼代码第16-20行,不管最前面是否存在字符序列首个字符,都会进入for循环进行脱字符处理,感觉有点浪费资源。可以修改为,如果前面存在要脱的字符,才去进行处理;否则就不处理。16-20行用下面代码代替:
  1.         if "%%i"=="%FCH%" (
  2.             for /f "tokens=* delims=%FCH%" %%k in ("!n1!") do set n2=%%k
  3.         ) else (
  4.             set n2=!n1!
  5.         )
复制代码
第26行修改为:
  1.             set Line=%FCH%
复制代码
1

评分人数

TOP

本帖最后由 qixiaobin0715 于 2024-9-14 11:01 编辑

楼主是四川的吗?
    本来选择学校时,想上师范,阴差阳错学了工科,没有当成老师,所以对于如何进行讲解不是太专业,还是最适合当个学生。从学生的角度来说,就是观察模仿。
    上面代码包括了字符的组合以及脱去组合字符中指定位置的指定字符,这样显得不是很好理解,如果弄明白字符是怎么组合的,再去理解脱字符的问题就要简单的多了。
    下面以最简单的组合(相当于数字输入3,字符序列输入0,1)去观察是如何实现字符组合序列的,其中goto循环了2次。
    10楼代码中goto循环一次,生成一行组合序列,共进行了2次循环,生成了2行组合序列,加上初始组合序列(0,1),共3行组合序列。为了便于理解,不使用上面的goto语句,而是将2次循环拆分为两个代码,来观察序列的形成过程。不同位置的变量显示我都做了特殊标记。
    无论是第1次第2次或第n次,前一个for循环中的元素(in后面的括号中)是不变的,都是初始组合序列(在这里是0,1);后一个for循环中的元素,每一次都用前一次循环得到的组合序列替换。2.bat中后一个for循环中的元素就是1.bat最终得到的组合序列(00,01,10,11)。
    我想应当没有讲的很清楚。描述起来比较麻烦,还是自己观察理解比较容易。
    感觉做代码的说明比写代码还费劲。

1.bat
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%i in (0,1) do (
  4. echo,--------
  5. echo,%%i
  6. echo,--------
  7.     for %%j in (0,1) do (
  8.         set n1=%%i%%j
  9.         echo,#%%j
  10.         echo,n1=!n1!
  11.         if defined str (
  12.             set str=!str!,!n1!
  13.             echo,str=!str!
  14.         ) else (
  15.             set str=!n1!
  16.             echo,@str=!str!
  17.         )
  18.     )
  19. )
  20. echo,!str!
  21. pause
复制代码
上面最终显示结果为第2行(未脱0)。



2.bat
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%i in (0,1) do (
  4. echo,--------
  5. echo,%%i
  6. echo,--------
  7.     for %%j in (00,01,10,11) do (
  8.         set n1=%%i%%j
  9.         echo,#%%j
  10.         echo,n1=!n1!
  11.         if defined str (
  12.             set str=!str!,!n1!
  13.             echo,str=!str!
  14.         ) else (
  15.             set str=!n1!
  16.             echo,@str=!str!
  17.         )
  18.     )
  19. )
  20. echo,!str!
  21. pause
复制代码
上面最终显示结果为第3行(未脱0)
上面显示的是未消0的情况,但是从上面的代码可以观察到,在第1个for循环中,只有第一个元素为0时,在组合字符中的最前面才会有0出现,这时才需要消0处理。

TOP

本帖最后由 zzz19760225 于 2024-9-16 16:33 编辑
回复  qixiaobin0715
楼主是四川的吗?
    本来选择学校时,想上师范,阴差阳错学了工科,没有当成老师 ...
qixiaobin0715 发表于 2024-9-14 09:52



谢谢老师讲解。
不是四川,是江苏的,因为以前一起跟车扛货的四川同事和网络看到的四川话,脑阔的音就自然出来了,四川话很好玩的。
我是将这些概念内容,当作生活内容去理解。
有些是买菜,洗菜,切菜,配菜,锅灶台空间分配,到锅空间里的先后时间顺序等。炒,煮,蒸,火锅等。
变量也可以理解为穿针引线,是结构功能的组织衣服裁剪缝纫。
这样如何将单元内容产生,并联系组合起来,再次变量变化联动起来,就成为一种需求满足的做事完成规律(希望能找到这种规律,就通用了,简化了)。
但是我一直没有理解怎么变化的问题,卡就卡在怎么去理解组合这个本体概念活动空间,以及本体活动的环境空间。(其后的选择就是反向操作,有些是可以组合原路反操作相同功能,有些是完全新的独立功能才行。)
所以想看看,你这个字符组合的内容是如何实现的(希望有一种简易的,简化的自由流态流通的变量层面世界,类似西方宗教化的数学机器世界,差别是唯物客观为主的相对关系组合聚散,也就是所谓的阴阳相对聚散。应该类似鲁班木或CAD的零件拆散,再集中的那种空间变化形态,用来显示信息变量开关机关联系关系。或者是编程的逻辑路径路线?)。
给添麻烦了

TOP

返回列表