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

[文本处理] [已解决]批处理如何按列拆分txt文本?

有一个txt文本,记录格式为
0000001 A B B C H ......M (7个数字组成的序号0000001,后面有63个字母组成一行,依次记为01 02 03 ......63列)
0000002 B M H J I .......N (7个数字组成的序号0000002,后面有63个字母组成一行,依次记为01 02 03 ......63列)
......
现欲将63个字母按固定的列数,拆分为3个txt文本,分别重新命名为123456、234567、17,7个数字组成的序号保留。

命名为123456的txt文本的列数组合为:01 02 03 04 05 07 08 09 10 12 13 14 16 17 19 22 23 24 25 26 28 29 30 31 33 34 35 37 38 40 43 44 45 46 47 49 50 51 52 54 55 56 58 59 61列(共45列)

命名为234567的txt文本的列数组合为:07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63列(共45列)


命名为17的txt文本的列数组合为:06 27 48列(共3列)


恳望大师出手相助!
1

评分人数

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

本帖最后由 canyuexiaolang 于 2012-7-12 12:32 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. set "filename=a.txt"
  3. set "line123456=01 02 03 04 05 07 08 09 10 12 13 14 16 17 19 22 23 24 25 26 28 29 30 31 33 34 35 37 38 40 43 44 45 46 47 49 50 51 52 54 55 56 58 59 61"
  4. set "line234567=07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63"
  5. set "line17=06 27 48"
  6. for /f "tokens=1* delims==" %%i in ('set line') do (
  7.     for %%a in (!%%i!) do (
  8.         for /f "tokens=1* delims= " %%f in (%filename%) do (
  9.             set "num=%%f"
  10.             if "%%i"=="line123456" if "!num:~-2!"=="%%a" echo %%f %%g >>123456.txt
  11.             if "%%i"=="line234567" if "!num:~-2!"=="%%a" echo %%f %%g >>234567.txt
  12.             if "%%i"=="line17" if "!num:~-2!"=="%%a" echo %%f %%g >>17.txt
  13. )))
  14. pause
复制代码


无奈效率太低,求大神写个效率高的。。

TOP

谢谢版主回复!上述代码有一些问题,得到的结果不是想要的,不知道问题出在哪里。

TOP

建议上传测试样本
另,顶楼所述似乎有两个命名为123456的txt文本

TOP

谢谢提醒,另一个123456应为234567,在原帖中改了。现上传测试文本。

TOP

回复 5# 思想之翼


   有什么错误么。。我测试通过了。请加312641104或者描述有什么错误

TOP

回复 3# 思想之翼



   我测试通过了亲。。生成了63行呢。。= =

TOP

您好!我只得到一个123456文本,而且内容有误。上传得到的文本,请帮助分析!

TOP

本帖最后由 CrLf 于 2012-7-17 18:57 编辑

纯批取列麻烦,但是读写文本很容易:
  1. @echo off
  2. set _123456=01 02 03 04 05 07 08 09 10 12 13 14 16 17 19 22 23 24 25 26 28 29 30 31 33 34 35 37 38 40 43 44 45 46 47 49 50 51 52 54 55 56 58 59 61
  3. set _234567=07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
  4. set _17=06 27 48
  5. for %%a in (123456 234567 17) do (
  6. for /f "delims=" %%b in (a.txt) do (
  7. set "var=%%b"
  8. setlocal enabledelayedexpansion
  9. for %%c in (!_%%a!) do (
  10. set /a "n=5+(1%%c-100)*2"
  11. for %%d in (!n!) do set str=!str!!var:~%%d,2!
  12. )
  13. echo !var:~,7!!str!
  14. endlocal
  15. )
  16. )>%%a.txt
复制代码
vbs取列方便,但是读写文本很麻烦:
  1. ar1 = Array(01,02,03,04,05,07,08,09,10,12,13,14,16,17,19,22,23,24,25,26,28,29,30,31,33,34,35,37,38,40,43,44,45,46,47,49,50,51,52,54,55,56,58,59,61)
  2. ar2 = array(07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63)
  3. ar3 = array(06,27,48)
  4. Set FSO = CreateObject("Scripting.FileSystemObject")
  5. getColumn ar1,"123456.txt"
  6. getColumn ar2,"234567.txt"
  7. getColumn ar3,"17.txt"
  8. Sub getColumn(ar,filename)
  9. Set file = FSO.OpenTextFile("a.txt",1)
  10. Do While file.AtEndOfStream <> True
  11. n = Split(file.ReadLine)
  12.                 str = str & n(0)
  13. For Each a In ar
  14. str = str & " " & n(a)
  15. Next
  16. str = str & vbCrLf
  17. Loop
  18. file.Close
  19. Set file = FSO.CreateTextFile(filename,True)
  20. file.Write str
  21. file.Close
  22. End Sub
复制代码
1

评分人数

TOP

谢谢!完美解决问题!赞一个!

TOP

回复 9# CrLf

CrLf 大大的代码果然犀利,不过VBS里有点小错误生成的只有最后一行、、
把第16行的 str =  n(0) 改成 str = str & n(0) 就好了,不然永远被最后一行覆盖、
1

评分人数

    • CrLf: 多谢指正PB + 5

TOP

返回列表