标题: [文本处理] [已解决]批处理如何按列拆分txt文本? [打印本页]
作者: 思想之翼 时间: 2012-7-12 12:01 标题: [已解决]批处理如何按列拆分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列)
恳望大师出手相助!
作者: canyuexiaolang 时间: 2012-7-12 12:22
本帖最后由 canyuexiaolang 于 2012-7-12 12:32 编辑
- @echo off & setlocal enabledelayedexpansion
- set "filename=a.txt"
- 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"
- 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"
- set "line17=06 27 48"
- for /f "tokens=1* delims==" %%i in ('set line') do (
- for %%a in (!%%i!) do (
- for /f "tokens=1* delims= " %%f in (%filename%) do (
- set "num=%%f"
- if "%%i"=="line123456" if "!num:~-2!"=="%%a" echo %%f %%g >>123456.txt
- if "%%i"=="line234567" if "!num:~-2!"=="%%a" echo %%f %%g >>234567.txt
- if "%%i"=="line17" if "!num:~-2!"=="%%a" echo %%f %%g >>17.txt
- )))
- pause
复制代码
无奈效率太低,求大神写个效率高的。。
作者: 思想之翼 时间: 2012-7-12 12:48
谢谢版主回复!上述代码有一些问题,得到的结果不是想要的,不知道问题出在哪里。
作者: CrLf 时间: 2012-7-12 13:08
建议上传测试样本
另,顶楼所述似乎有两个命名为123456的txt文本
作者: 思想之翼 时间: 2012-7-12 13:21
谢谢提醒,另一个123456应为234567,在原帖中改了。现上传测试文本。
作者: canyuexiaolang 时间: 2012-7-12 13:35
回复 5# 思想之翼
有什么错误么。。我测试通过了。请加312641104或者描述有什么错误
作者: canyuexiaolang 时间: 2012-7-12 13:40
回复 3# 思想之翼
我测试通过了亲。。生成了63行呢。。= =
作者: 思想之翼 时间: 2012-7-12 13:43
您好!我只得到一个123456文本,而且内容有误。上传得到的文本,请帮助分析!
作者: CrLf 时间: 2012-7-12 14:06
本帖最后由 CrLf 于 2012-7-17 18:57 编辑
纯批取列麻烦,但是读写文本很容易:- @echo off
- 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
- 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
- set _17=06 27 48
-
- for %%a in (123456 234567 17) do (
- for /f "delims=" %%b in (a.txt) do (
- set "var=%%b"
- setlocal enabledelayedexpansion
- for %%c in (!_%%a!) do (
- set /a "n=5+(1%%c-100)*2"
- for %%d in (!n!) do set str=!str!!var:~%%d,2!
- )
- echo !var:~,7!!str!
- endlocal
- )
- )>%%a.txt
复制代码
vbs取列方便,但是读写文本很麻烦:- 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)
- 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)
- ar3 = array(06,27,48)
-
- Set FSO = CreateObject("Scripting.FileSystemObject")
-
- getColumn ar1,"123456.txt"
- getColumn ar2,"234567.txt"
- getColumn ar3,"17.txt"
-
- Sub getColumn(ar,filename)
- Set file = FSO.OpenTextFile("a.txt",1)
-
- Do While file.AtEndOfStream <> True
- n = Split(file.ReadLine)
- str = str & n(0)
- For Each a In ar
- str = str & " " & n(a)
- Next
- str = str & vbCrLf
- Loop
-
- file.Close
-
- Set file = FSO.CreateTextFile(filename,True)
- file.Write str
- file.Close
- End Sub
-
复制代码
作者: 思想之翼 时间: 2012-7-12 15:07
谢谢!完美解决问题!赞一个!
作者: 乱码 时间: 2012-7-17 17:48
回复 9# CrLf
CrLf 大大的代码果然犀利,不过VBS里有点小错误生成的只有最后一行、、
把第16行的 str = n(0) 改成 str = str & n(0) 就好了,不然永远被最后一行覆盖、
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |