Board logo

标题: [求助]通过原始文本文件转换成另一种格式的文本文件 [打印本页]

作者: dhlmdsnw     时间: 2008-1-29 02:08    标题: [求助]通过原始文本文件转换成另一种格式的文本文件

我这边有一个原始文本文件:01067-01090800-080122-01.txt,下面简称a
要把里面的内容换成另一种文本文件的格式:140820080122001.txt,下面简称b
如何批处理操作?——恳请各位大虾帮忙。。。。不胜感谢!
注意几点:
1.b文件字节不能有变化,即使是后面的空白,也要保留。
2.文件名中都包含当天日期的信息,如080122或者20080122
3.b文件中的最后一行是汇总行:只有三个地方有变动,一个是顺序号:8,一个是汇总数据:17750,一个是汇总编号:7。——很容易看出来的——其他都不变。a文本文件如下:
1147666                  1407002601001238877           000000000270200      352201197511250011  林书文              20080122000106701080001003    797503              01090800                                                   
1147669                  1407002501000591238           000000000250000      352226197308020023  蒋璟                20080122000106701080000977    797503              01090800                                                   
1147670                  1407002501000591238           000000000250000      352226197308020023  蒋璟                20080122000106701080000981    797503              01090800                                                   
1147671                  1407002601001236701           000000000254800      352221196007114118  黄尚灯              20080122000106701080000945    797503              01090800                                                   
1147672                  1407002501000591114           000000000250000      352202800608331     陈爱国              20080122000106701080000931    797503              01090800                                                   
1147673                  1407002501000591114           000000000250000      352202800608331     陈爱国              20080122000106701080000963    797503              01090800                                                   
1148256                  1407700601101953789           000000000250000      352201197301142639  吴丽玉              20080122000106701080001017    797503              01090800                                                   



b文本文件如下:
21408000502021407002601001238877300000100000000000270200000000000000000011                    000000000林书文                                               
21408000502021407002501000591238300000200000000000250000000000000000000011                    000000001蒋璟                                                
21408000502021407002501000591238300000300000000000250000000000000000000011                    000000002蒋璟                                                
21408000502021407002601001236701300000400000000000254800000000000000000011                    000000003黄尚灯                                               
21408000502021407002501000591114300000500000000000250000000000000000000011                    000000004陈爱国                                               
21408000502021407002501000591114300000600000000000250000000000000000000011                    000000005陈爱国                                               
21408000502021407700601101953789300000700000000000250000000000000000000011                    000000006吴丽玉                                               
11408000502021408010011200362414300000800000000001775000000000000000000072
作者: HAT     时间: 2008-1-29 12:26
资质愚钝,实在看不出a、b两个文件的数据有什么联系。
作者: dhlmdsnw     时间: 2008-1-29 14:16
不好意思,可能是我没讲清楚
b文件中每一行(除了最后一行)前面的:140800050202是固定的,后面1407002601001238877是变动的,来源于a文件,再后面的3是固定的,再后面的
000001代表流水号,把它看成行号也可,如果是第11行,那么表达为000011,再后面的00是固定的,再后面的000000000270200是变动的,来源于a文件,再后面的00000000000000000011                    (包括空白)都是固定的,再后面的:000000000又是一个流水号,规则跟前一个一样,只不过这个流水号是从0开始的。最后的:林书文,是变动的,来源于a文件。
不知道这样讲可以清楚吗?——希望各位大大帮帮新人丫。。。谢了先!!!
作者: dhlmdsnw     时间: 2008-1-29 14:25
对了b文件中林书文后面的空白                                               也是要保留的,如果是四个字的人名,那么占用空白,也就是说“人名+空白”所占用的总数是不变的,我不知道这个“总数”在文本文件中是不是字节的概念,但是有一个方法可以验证,就是Ctrl+a全选,全选后每一行都被蓝色覆盖的满满的每有留一点空白的意思。
b文件中最后一行汇总行除了我说的那3个地方有变动外,其他的文本都不变。

在此先谢谢二楼大虾的关注。。。
作者: dhlmdsnw     时间: 2008-1-29 14:32
二楼的大虾有QQ吗?——我可加你,然后把文件传过去给你啊。。。
五颗星耶。。。肯定是不世出的高手啊。。。。
作者: dhlmdsnw     时间: 2008-1-29 14:46
再次提醒:a文件的每一行都是从1147开始的,在第二个1147的前面有一个黑色高亮的小方块(类似于光标固定往右拖一个字节的效果,只不过它是黑色的)来做为分隔符。——实在不好意思,第一次发帖,难免忘东忘西的。。。请各位位大大原谅则个。。。
作者: terse     时间: 2008-1-29 17:34
上面B文件最后一行没处理  不知道是不是这个意思
@echo off
set m=0
setlocal enabledelayedexpansion
for /f "tokens=2,3,5" %%i in (a.txt) do (
               set/a n+=1
               set src1=%%i
               set src2=%%j
               set src3=%%k
               set var=00000!n!
               set var=!var:~-6!
               set vcr=00000000!m!
               set vcr=!vcr:~-9!
               >>b.txt echo.140800050202!src1!3!var!00!src2!000000000000000011                    !vcr!!src3!                                               
               set/a m+=1
)
pause
作者: flying008     时间: 2008-1-29 17:56
变量延迟循环变量 ……让偶够学一阵的了……
作者: dhlmdsnw     时间: 2008-1-29 21:03
哇,7楼的大大好厉害哦。。。基本已经有模型。。。
不要怪我贪心哦,还是有三个问题:
1.人名为两个字时如“蒋璟”,我在Ctrl+C全选时发现,后面会出现两个字节的空白,也就说格式与其他的不一致,请帮助调成一致。另外请考虑“人名”是变动的情况下如何也能保持一致,(例如:四个字、甚至出现外国人名字时的情况)。
2.b文件名是否能调成"14080005022080129001.txt",其中14080005022是固定的,080129是变动的,体现当天日期(例如:明天30号,就生成14080005022080130001.txt,如果当天是2月1号就生成14080005022080201001.txt),最后的001是流水号,代表我同一天做了这种同样的操作做了几次(例如:我的a1文件生成了b1,那么b1的文件名就是14080005022080130001.txt,接着我又用a2的文件生成了b2,那么b2的文件名就是14080005022080130002.txt)
3.当然还是恳请各位大大帮助把最后汇总的一行添加进文件中。
再次感谢7楼的大虾帮我解决了很大的一部分麻烦,고 맙 습 니 다 !(谢谢!)
请各位大大再展神威啊。。。。。
谢了先!
作者: dhlmdsnw     时间: 2008-1-29 21:13
再次补充:对于b的文件名最后的流水号能和a的文件名的流水号(a文件名最后两个"01")保持一致就好了,只不过b是用三位数如001来做流水号,而a是用两位数01来做流水号。~~唉。。。真不知道各位大大还没碰到我这种新手了。。。实在不好意思,各位大大加油啊。。。。
作者: terse     时间: 2008-1-29 21:49
你把B.TXT换成14080005022%date:~0,4%%date:~5,2%%date:~8,2%.TXT就是固定号加日期名了 至于00X序列如果是一次处理多个文件还是可以的,单独运行那就不行,还有最后一行的信息是从那里来的你都没说清楚啊
作者: dhlmdsnw     时间: 2008-1-29 23:13
先回复11楼大大的,b文件中的最后一行是汇总行,在这个例子中只有三个地方有变动,一个是顺序号:8,一个是汇总数据:17750,一个是汇总编号:7。也就是说前面114080005020214080100112003624143是固定的,后面的000008是变动的,是前面一行000007流水号往下填的(例如:前面一行是000011,后面一行这个地方就是000012,如果前面一行是000111,那这个地方就变成000112),再后面的00是固定的,而后面的00000000177500又是变动的,00000000177500是前面所有行对应位置数据的汇总数如(第1行对应位置的数据是000000000270200+第1行对应位置的数据是000000000250000+....+第7行对应位置的数据是000000000250000=00000000177500),再后面的000000000000000007是变动的,用来表示前面总共有几行(例如:除最后一行外,前面总共有100行,那这个位置数据就该为000000000000000100),最后的2                                                                                  (包括空白)都是固定的。——谢谢11楼大大的关注与建议。。。非常感谢!
作者: dhlmdsnw     时间: 2008-1-29 23:21
试了11楼大虾的代码,果然非常棒,有一个小问题,还请帮助解决:我需要的日期格式是080129,用了大大的代码是出现20080129能否把前面的20去掉呢?再次感谢各位大大的关注。。。。
作者: zh159     时间: 2008-1-29 23:24


  Quote:
Originally posted by dhlmdsnw at 2008-1-29 23:21:
试了11楼大虾的代码,果然非常棒,有一个小问题,还请帮助解决:我需要的日期格式是080129,用了大大的代码是出现20080129能否把前面的20去掉呢?再次感谢各位大大的关注。。。。

%date:~0,4%改为%date:~2,2%
作者: dhlmdsnw     时间: 2008-1-30 00:26
哇噻,大虾啊。。。谢谢14楼的大虾。。。又推进了一步了。。。非常感谢!!!
还请继续关注啊。。。。
小妹在此谢过各位大大了。。。
我快看到胜利的曙光了。。。
果然藏龙卧虎啊。。。
努力学习各位的精华。。。。
作者: dhlmdsnw     时间: 2008-1-30 00:54
各位大大加油啊。。。人名问题及最后一行汇总行问题谁能帮我处理一下啊。。。
小妹急切盼望中。。。。
作者: terse     时间: 2008-1-30 02:33
因为中英文空格 人名问题没解决
@echo off
set m=0
set psrc=0
setlocal enabledelayedexpansion
for /f "tokens=2,3,5" %%i in (a01.txt) do (
               set/a n+=1
               set src1=%%i
               set src2=%%j
               set src3=%%k              
               set var=00000!n!
               set var=!var:~-6!
               set vcr=00000000!m!
               set vcr=!vcr:~-9!
               for /f "delims=0 tokens=*" %%a in ("!src2!") do set/a psrc=!psrc!+%%a
               >>14080005022%date:~2,2%%date:~5,2%%date:~8,2%.txt echo.140800050202!src1!3!var!00!src2!000000000000000011                    !vcr!!src3!
               set/a m+=1

)
set psrc=000000000000000%psrc%
set scr=00000000000000000%n%2
set/a n+=1
set var=00000%n%
>>14080005022%date:~2,2%%date:~5,2%%date:~8,2%.txt echo.114080005020214080100112003624143%var:~-6%%psrc:~-16%%scr:~-19%                                               
pause

[ Last edited by terse on 2008-1-30 at 03:05 AM ]
作者: dhlmdsnw     时间: 2008-1-30 13:45
先感谢terse大虾的大力帮助,我还没试,只不过一回来就看见大大给我回了帖就感激万分!

在人名问题上如果先不考虑外国人名的问题,就是说全部都是中文的情况可以解决吗?——因为在实际操作中,我还没碰上要外国人名操作的,只是我自己想的。——如果仅中文人名可以操作的话,还请大大先把代码发上来给我。

再次感谢terse大大!!!
作者: dhlmdsnw     时间: 2008-1-30 14:44
terse大大上面的编码,我稍微按照我的需求做了一些细节的修正:

1.第五行a01.txt,改成了a.txt
2.第十五行14080005022%date:~2,2%%date:~5,2%%date:~8,2%.txt,改成了140800050%date:~0,4%%date:~5,2%%date:~8,2%001.txt。改这个最不好意思的,这个是我自己弄错了文件命名规则。
3.同样是第十五行echo.140800050202!,改成了echo.2140800050202!
4.同第十五行一致,第二十一行的14080005022%date:~2,2%%date:~5,2%%date:~8,2%.txt,改成了140800050%date:~0,4%%date:~5,2%%date:~8,2%001.txt。
改完后的代码全部如下:
@echo off
set m=0
set psrc=0
setlocal enabledelayedexpansion
for /f "tokens=2,3,5" %%i in (a.txt) do (
               set/a n+=1
               set src1=%%i
               set src2=%%j
               set src3=%%k              
               set var=00000!n!
               set var=!var:~-6!
               set vcr=00000000!m!
               set vcr=!vcr:~-9!
               for /f "delims=0 tokens=*" %%a in ("!src2!") do set/a psrc=!psrc!+%%a
               >>140800050%date:~0,4%%date:~5,2%%date:~8,2%001.txt echo.2140800050202!src1!3!var!00!src2!000000000000000011                    !vcr!!src3!
               set/a m+=1

)
set psrc=000000000000000%psrc%
set scr=00000000000000000%n%2
set/a n+=1
set var=00000%n%
>>140800050%date:~0,4%%date:~5,2%%date:~8,2%001.txt echo.114080005020214080100112003624143%var:~-6%%psrc:~-16%%scr:~-19%                                               
pause

经过试验,主要产生以下两个问题:
1.“名字+后面的空白”字节数不够,需要的是这样的结果:“名字+后面的空白”全部选中,然后把它复制粘贴到Excel的单元格中,用函数len来验证,如果名字是两个字的,“名字+后面的空白”len的返回值是51;如果名字是三位数的,“名字+后面的空白”len的返回值是50;如果名字是四位数的,“名字+后面的空白”len的返回值是49
。而用大大的代码,名字是两位数的,“名字+后面的空白”len的返回值是16;名字是三位数的,“名字+后面的空白”len的返回值是17。相差较大。
2.最后一行汇总行,最后一个数据2后面所需的空白数,用Excel的len函数返回值来表示是需要82个字节。而大大代码所产生空白数仅47。也是相差较大。

最后还有名字的处理问题帮助多多改善。

上面的细节全部处理后,所产生的文件用Ctrl+A全选后,蓝色的光幕是填满每一行,每一行没有任何的空白。
还请大大继续帮我改善这个代码!
在此万分感谢!!!
作者: terse     时间: 2008-1-30 21:17
重新改一下 不知有效果否?
@echo off
set m=0
set psrc=0
set len=                                   
setlocal enabledelayedexpansion
for /f "tokens=2,3,5" %%i in (a.txt) do (
               set/a n+=1
               set src1=%%i
               set src2=%%j
               set src3=%%k
               set var=00000!n!
               set var=!var:~-6!
               set vcr=00000000!m!
               set vcr=!vcr:~-9!
               for /f "delims=0 tokens=*" %%a in ("!src2!") do set/a psrc=!psrc!+%%a
               for /f "skip=1 delims=:" %%x in ('^(echo "!src3!"^&echo.^)^|findstr /o ".*"') do set/a l=63-%%x-5
               call :loop !l!
>>140800050%date:~0,4%%date:~5,2%%date:~8,2%001.txt echo.2140800050202!src1!3!var!00!src2!000000000000000011                    !vcr!!src3!
  set/a m+=1
)
set psrc=000000000000000%psrc%
set scr=00000000000000000%n%2
set/a n+=1
set var=00000%n%
>>140800050%date:~0,4%%date:~5,2%%date:~8,2%001.txt echo.114080005020214080100112003624143%var:~-6%%psrc:~-16%%scr:~-19%%len:~0,35%                                               
pause
:loop
set/a mn+=1
set src3=%src3%
if %1 neq %mn% goto loop
set mn=
作者: dhlmdsnw     时间: 2008-1-30 21:32
哇。。。。耶耶耶。。。。
terse大大,我爱死你了!——耶耶耶。。。。。
什么没得说,就一句话感谢。。。我有得说。。。。非常感谢。。。고 맙 습 니 다 !
太好了。。。我对你的景仰真得如涛涛江水,绵绵不绝。。。如雷贯耳。。。哇噻。。。简直太棒了。。。。丫丫丫。。。。
——不过不知道会不会乐极生悲,明天拿到公司去试一下手。。。嘿嘿。。。每天都会要处理这样的东东。。好多丫。。。。我真是太感谢了!。。。大大万岁。。。。!!!!
作者: dhlmdsnw     时间: 2008-1-30 21:39
哇噻,如果明天一下子双击一秒钟搞定,不知道那些人会拿什么眼光看我,会不会也对我景仰得如涛涛江水、绵绵不绝啊。。。想得都流口水了。。。。嘿嘿。。。terse大大,你不介意我在我的同事面前小秀一把吧。。。呵呵。。当然在论坛上我可不敢乱说。。。呵呵。。。耶耶耶。。。。成功。。成功。。。今天可以好好吃点东西。。睡个好觉。。。逛个好街了。。。大大的功劳最大!
同样也要感谢所有关注本帖的各位大虾,고 맙 습 니 다 !(谢谢!)。。。
啦啦啦。。。。。。
作者: dhlmdsnw     时间: 2008-1-30 21:44
terse大大,小小声的跟你说一下,我在论坛上还有一个帖子没解决。。。你看你老是不是休息两天。。。再到我那边看看啊。。。。嘿。。。怪不好意思的。。。。帖子的标题是“删除文本文件中的特殊字符但保持格式不变”,发了一两天了,都没人给个框架。。。。。当然你得好好休息一下。。。。期待中。。。。嘿嘿。。。http://www.cn-dos.net/forum/view ... ge=1&highlight=
作者: dhlmdsnw     时间: 2008-1-30 21:51
天哪,乐得没边没谱了,忘了问一句:terse大大,你的代码支持外国名字不?
作者: terse     时间: 2008-1-30 21:55


  Quote:
Originally posted by dhlmdsnw at 2008-1-30 21:51:
天哪,乐得没边没谱了,忘了问一句:terse大大,你的代码支持外国名字不?

你试一下吧  应该可以
作者: dhlmdsnw     时间: 2008-1-30 21:57
说真的大大,我只学了一些最容易的VBA,都写好代码了,但是要经过Excel转换,我后来一想,为什么我不能直接一点呢,到后面翻了好多资料才约略懂得可以通过批处理进行直接转换。。。可是看了一些批处理的教学资料。。。感觉如果要解决还需要很多的时间。。。因此就上了这个论坛。。。通过学习你的代码。。。特别是一步一步解决我的问题。。。让我学到了许多有用的东西。。。我会进一步学习的。。。谢谢大大的支持!!!
作者: dhlmdsnw     时间: 2008-1-30 22:20
terse大大:经过测试:测试样本如:潘迪特·辛格、Tom Marvolo Riddle、特里帕蒂·辛格。中文的名字都没问题,如果是外国的名字,转换后就变成Tom了,后面的都没了,成空白了。。。没关系。。。以后我通过努力学习会把terse大大的这个模型给完善的,大大不用操心了。。。。总得留一点作业让我这后辈有一点东西可做嘛。。。什么事都让你亲自出马,那多不好啊。。。高手总得用在刀刃上。。嘿嘿。。。。大大休息完有空了,可要到我的另一张帖子上看看啊。。。谢了先!。。。呵呵。。。
作者: dhlmdsnw     时间: 2008-1-31 12:27
大大,太奇怪了。。。。我用了你的代码双击完。。。什么反应都没有?也没生成:14080005020080131001.txt文件,真是太奇怪了,什么事情都没发生?是不是我的电脑有问题啊。。。在家我是用XP,在公司是用2000。——我是先通过一个批处理,里面代码:copy *.txt /b a.txt /b。汇总生成一个a.txt文件,然后再用大大的代码,双击完就什么都没发生了?——大大再帮助看看啊。。。。
作者: dhlmdsnw     时间: 2008-1-31 22:12
我终于懂了。。。。原来是我原始文件行数较多,它要处理将近15秒呢。。。最后才生成的。。。。唉,真晕,我这没基础的人。。。
不过大大,还是出现了一个变数,还请帮助我解决一下。。。。
问题是:b文件中每一行(除了最后一行)前面的:140800050202是固定的,后面1407002601001238877是变动的,来源于a文件,但a文件中这个地方数字的最后如果出现非数字符号如*号(像这样1407002601001238877*),请帮助去掉,不是用空白来替换,也不是后面的空白往前整。而是实实在在的删除一个字节的意思。可以吗?——先谢了!!——还请大大们也继续关注啊。。。
期待中。。。。
作者: slore     时间: 2008-2-1 03:24
本来打算睡觉,还是写完算了(有Example.vbs,改改就删除了,不然桌面好乱),基本结构套了上个脚本。


Example2.vbs:

  Quote:
Const ForReading = 1       '设定打开文本方式为读取
Const ForWriting = 2       '设定打开文本方式为写入
Const ForAppending = 8     '设定打开文本方式为追加

Const InFile = "a.txt"     '设定打开的文本

Dim i
Dim StrLine,OutStr
i = 1

'On Error Resume Next

Set objFSO = CreateObject("Scripting.FileSystemObject")  '引用FSO对象,读写文件要用到的
Set objFile = objFSO.OpenTextFile(InFile, ForReading)    '以读取方式打开InFile

Do Until objFile.AtEndOfStream
    StrLine = objFile.ReadLine       '读取一行
   
If Len(StrLine) Then             '如果不是空行
        
StrLine = FixStr(StrLine)
        
NeedData = Split(StrLine," ")
        
If Right(NeedData(1),1) = "*" Then NeedData(1) = Left(NeedData(1),Len(NeedData(1)) - 1)
        
OutLine = "2140800050202" & NeedData(1) & "3" & AddZero(i,6) & "00" & NeedData(2)
        
OutLine = OutLine & "000000000000000011                    " & AddZero(i - 1,9) & NeedData(4)
        
OutStr = OutStr & OutLine & vbCrLf
        
i = i + 1
    End If
Loop
OutStr = OutStr & "14080005020214080100112003624143" & AddZero(i,6)
OutStr = OutStr & "00000000001775000000000000000000072 "          '你上面是不是写漏了2? 2的含义不清。


objFile.Close             '关闭文件对象


OutFile = "140820" & FormatDate(Date) & "001.txt"
Set objFile = objFSO.OpenTextFile(OutFile, ForWriting,True)  '以写入方式打开OutFile
objFile.Write OutStr
objFile.Close             '关闭文件对象

Set objFile = Nothing
Set
objFSO = Nothing

Function
FixStr(StrExp)
   
Do While InStr(StrExp,"  ")
        
StrExp = Replace(StrExp,"  "," ")
   
Loop
   
FixStr = StrExp
End Function

Function
FormatDate(tDate)
   
FormatDate = Right(Year(tDate),2) & AddZero(Month(tDate),2) & AddZero(Day(tDate),2)
End Function

Function
AddZero(sNum,iLen)
   
Addzero = Right("000000000" & sNum,iLen)
End Function

把quote写成code了... -。-
作者: slore     时间: 2008-2-1 03:26
PS:vbs的速度应该很快……具体多少我没有数据,你自己测试下吧。
作者: dhlmdsnw     时间: 2008-2-1 11:30
非常感谢slore大大的帮忙,用了大大的代码还会产生以下的小问题:
请再帮助看看:
1.OutStr = OutStr & "14080005020214080100112003624143" & AddZero(i,6)
OutStr = OutStr & "00000000001775000000000000000000072 "          '你上面是不是写漏了2? 2的含义不清。
真不好意思是我漏写了一个1,2代表明细行,1代表汇总行。应该是如下:
OutStr = OutStr & "114080005020214080100112003624143" & AddZero(i,6)
OutStr = OutStr & "00000000001775000000000000000000072 "
2.另外我最后一行汇总行的17750不是固定是变动的,规则如下:
b文件中的最后一行是汇总行,在这个例子中只有三个地方有变动,一个是顺序号:8,一个是汇总数据:17750,一个是汇总编号:7。也就是说前面114080005020214080100112003624143是固定的,后面的000008是变动的,是前面一行000007流水号往下填的(例如:前面一行是000011,后面一行这个地方就是000012,如果前面一行是000111,那这个地方就变成000112),再后面的00是固定的,而后面的00000000177500又是变动的,00000000177500是前面所有行对应位置数据的汇总数如(第1行对应位置的数据是000000000270200+第1行对应位置的数据是000000000250000+....+第7行对应位置的数据是000000000250000=00000000177500),再后面的000000000000000007是变动的,用来表示前面总共有几行(例如:除最后一行外,前面总共有100行,那这个位置数据就该为000000000000000100),最后的2                                                                                  (包括空白)都是固定的。

3.用大大代码生成的每一行,名字后面的空白的字节都没有了,关于“名字+后面的空白字节”的规则如下:
需要的是这样的结果:“名字+后面的空白”全部选中,然后把它复制粘贴到Excel的单元格中,用函数len来验证,如果名字是两个字的,“名字+后面的空白”len的返回值是51;如果名字是三位数的,“名字+后面的空白”len的返回值是50;如果名字是四位数的,“名字+后面的空白”len的返回值是49。
最后一行汇总行,最后一个数据2后面所需的空白数,用Excel的len函数返回值来表示是需要82个字节。

上面的细节全部处理后,所产生的文件用Ctrl+A全选后,蓝色的光幕是填满每一行,没有任何的空白,每一行的字节在文本文件中应该是相等的。
还请大大继续帮我改善这个代码!

고 맙 습 니 다 !!
作者: slore     时间: 2008-2-1 12:31
会VBA看不懂?自己不能适当的修改下。。。你起的真早。。。


Example2+.vbs:

  Quote:
Const ForReading = 1       '设定打开文本方式为读取
Const ForWriting = 2       '设定打开文本方式为写入
Const ForAppending = 8     '设定打开文本方式为追加

Const InFile = "a.txt"     '设定打开的文本

Dim i,Sum
Dim StrLine,OutStr
i = 1:Sum = 0

'On Error Resume Next

Set objFSO = CreateObject("Scripting.FileSystemObject")  '引用FSO对象,读写文件要用到的
Set objFile = objFSO.OpenTextFile(InFile, ForReading)    '以读取方式打开InFile

Do Until objFile.AtEndOfStream
    StrLine = objFile.ReadLine       '读取一行
   
If Len(StrLine) Then             '如果不是空行
        
StrLine = FixStr(StrLine)
        
NeedData = Split(StrLine," ")
        
If Right(NeedData(1),1) = "*" Then NeedData(1) = Left(NeedData(1),Len(NeedData(1)) - 1)
        
NeedData(4) = NeedData(4) & Space(53 - Len(NeedData(4)))
        
OutLine = "2140800050202" & NeedData(1) & "3" & AddZero(i,6) & "00" & NeedData(2)
        
OutLine = OutLine & "000000000000000011                    " & AddZero(i - 1,9) & NeedData(4)
        
OutStr = OutStr & OutLine & vbCrLf
        
i = i + 1
        Sum = Sum + CLng(NeedData(2))
   
End If
Loop
OutStr = OutStr & "14080005020214080100112003624143" & AddZero(i,6)
OutStr = OutStr & "00" & AddZero(Sum,15) & "0000000" & AddZero(i - 1,9) & "2" & Space(82)


objFile.Close             '关闭文件对象


OutFile = "140820" & FormatDate(Date) & "001.txt"
Set objFile = objFSO.OpenTextFile(OutFile, ForWriting,True)  '以写入方式打开OutFile
objFile.Write OutStr
objFile.Close             '关闭文件对象

Set objFile = Nothing
Set
objFSO = Nothing

Function
FixStr(StrExp)
   
Do While InStr(StrExp,"  ")
        
StrExp = Replace(StrExp,"  "," ")
   
Loop
   
FixStr = StrExp
End Function

Function
FormatDate(tDate)
   
FormatDate = Right(Year(tDate),2) & AddZero(Month(tDate),2) & AddZero(Day(tDate),2)
End Function

Function
AddZero(sNum,iLen)
   
Addzero = Right("000000000" & sNum,iLen)
End Function


作者: dhlmdsnw     时间: 2008-2-1 12:54
sorry,大大,小妹的VBA也是很菜的啦。。。刚入门啊。。。还在学当中啊。。。不能说会啊。。。也是半路出家啊。。。刚学了三个月,前面都是教在Excel中怎么操作,到目前才学到文本导入导出这方面的知识啊。。。还未试,听了大大的教训,惶恐中。。。先回了大大。。
努力学习中。。。以后还要大大继续帮助啊!
测试中。。。
고 맙 습 니 다 !!
作者: dhlmdsnw     时间: 2008-2-1 18:22
报告slore大大,用了大大的代码,虽然出现了一些小问题,但受大大点拨许多,这点小问题还是决定要自己努力克服,要不然怎么会进步呢。。。埋头了半天,终于明白了主要原因所在,len函数在Excel2000中应用,一个汉字,它的返回值是1,而在文本文件中一个汉字是占两位字节的。虽然结果出来可能会被大大们嗤之以鼻,但是毕竟是我自己总结的,也向大大说明,我也是积极的在努力学习中,而不是一个只要代码的懒人,同时在埋头研究大大的代码过程中,也是学到许多精华。。。现把个人稍微修改后的代码上传:
Const ForReading = 1       '设定打开文本方式为读取
Const ForWriting = 2       '设定打开文本方式为写入
Const ForAppending = 8     '设定打开文本方式为追加

Const InFile = "a.txt"     '设定打开的文本

Dim i,Sum
Dim StrLine,OutStr
i = 1:Sum = 0

'On Error Resume Next

Set objFSO = CreateObject("Scripting.FileSystemObject")  '引用FSO对象,读写文件要用到的
Set objFile = objFSO.OpenTextFile(InFile, ForReading)    '以读取方式打开InFile

Do Until objFile.AtEndOfStream
    StrLine = objFile.ReadLine       '读取一行
    If Len(StrLine) Then             '如果不是空行
        StrLine = FixStr(StrLine)
        NeedData = Split(StrLine," ")
        If Right(NeedData(1),1) = "*" Then NeedData(1) = Left(NeedData(1),Len(NeedData(1)) - 1)
        NeedData(4) = NeedData(4) & Space(53 - Len(NeedData(4))*2)
        OutLine = "2140800050202" & mid((NeedData(1) & space(10)),1,19) & "3" & AddZero(i,6) & "00" & NeedData(2)
        OutLine = OutLine & "000000000000000011                    " & AddZero(i - 1,9) & NeedData(4)
        OutStr = OutStr & OutLine & vbCrLf
        i = i + 1
        Sum = Sum + CLng(NeedData(2))
    End If
Loop
OutStr = OutStr & "114080005020214080100112003624143" & AddZero(i,6)
OutStr = OutStr & "00" & AddZero(Sum,15) & "0000000" & AddZero(i - 1,10) & "2" & Space(82)


objFile.Close             '关闭文件对象


OutFile = "140800050" & FormatDate(Date) & "001.txt"
Set objFile = objFSO.OpenTextFile(OutFile, ForWriting,True)  '以写入方式打开OutFile
objFile.Write OutStr
objFile.Close             '关闭文件对象

Set objFile = Nothing
Set objFSO = Nothing

Function FixStr(StrExp)
    Do While InStr(StrExp,"  ")
        StrExp = Replace(StrExp,"  "," ")
    Loop
    FixStr = StrExp
End Function

Function FormatDate(tDate)
    FormatDate = Right(Year(tDate),2) & AddZero(Month(tDate),2) & AddZero(Day(tDate),2)
End Function

Function AddZero(sNum,iLen)
    Addzero = Right("00000000000" & sNum,iLen)
End Function

真的非常感谢slore大大对我帮助。。请大大务必在以后继续给我以帮助。。。谢了先!

本问题已经解决了,谢谢各位大大们的关注与支持。

고 맙 습 니 다 !!

努力学习中。。。。
作者: slore     时间: 2008-2-1 18:56
那个中文的我本来想问呢。就觉得怪怪的。

不过你那样都*2了,如果是e文的就不对了……
不过应该都是中文吧。。。。
作者: dhlmdsnw     时间: 2008-2-1 19:02
是的,目前实际操作当中都还只是中文,如果出现e文呢?——大大可有改进的通用版可以给我吗?。。。。嘿嘿。。。不要怪我贪心啊。。。

고 맙 습 니 다 !!
作者: slore     时间: 2008-2-1 19:36
甚至支持中英混合名...汗~应该没有吧。
只该了一个地方,len该成了MixLen。

Example++.vbs:

  Quote:
Const ForReading = 1       '设定打开文本方式为读取
Const ForWriting = 2       '设定打开文本方式为写入
Const ForAppending = 8     '设定打开文本方式为追加

Const InFile = "a.txt"     '设定打开的文本

Dim i,Sum
Dim StrLine,OutStr
i = 1:Sum = 0

'On Error Resume Next

Set objFSO = CreateObject("Scripting.FileSystemObject")  '引用FSO对象,读写文件要用到的
Set objFile = objFSO.OpenTextFile(InFile, ForReading)    '以读取方式打开InFile

Do Until objFile.AtEndOfStream
    StrLine = objFile.ReadLine       '读取一行
   
If Len(StrLine) Then             '如果不是空行
        
StrLine = FixStr(StrLine)
        
NeedData = Split(StrLine," ")
        
If Right(NeedData(1),1) = "*" Then NeedData(1) = Left(NeedData(1),Len(NeedData(1)) - 1)
        
NeedData(4) = NeedData(4) & Space(53 - MixLen(NeedData(4)))
        
OutLine = "2140800050202" & NeedData(1) & "3" & AddZero(i,6) & "00" & NeedData(2)
        
OutLine = OutLine & "000000000000000011                    " & AddZero(i - 1,9) & NeedData(4)
        
OutStr = OutStr & OutLine & vbCrLf
        
i = i + 1
        Sum = Sum + CLng(NeedData(2))
   
End If
Loop
OutStr = OutStr & "14080005020214080100112003624143" & AddZero(i,6)
OutStr = OutStr & "00" & AddZero(Sum,15) & "0000000" & AddZero(i - 1,9) & "2" & Space(82)


objFile.Close             '关闭文件对象


OutFile = "140820" & FormatDate(Date) & "001.txt"
Set objFile = objFSO.OpenTextFile(OutFile, ForWriting,True)  '以写入方式打开OutFile
objFile.Write OutStr
objFile.Close             '关闭文件对象

Set objFile = Nothing
Set
objFSO = Nothing


Function
AddZero(sNum,iLen)
   
Addzero = Right("000000000" & sNum,iLen)
End Function

Function
FixStr(StrExp)
   
Do While InStr(StrExp,"  ")
        
StrExp = Replace(StrExp,"  "," ")
   
Loop
   
FixStr = StrExp
End Function

Function
MixLen(StrExp)
   
Dim i,c
    For i = 1 To Len(StrExp)
        
c = Asc(Mid(StrExp, i, 1))
        
If Not (C >= 0 And C < 128) Then MixLen  = MixLen + 1
        MixLen  = MixLen + 1
    Next
End Function

Function
FormatDate(tDate)
   
FormatDate = Right(Year(tDate),2) & AddZero(Month(tDate),2) & AddZero(Day(tDate),2)
End Function


作者: dhlmdsnw     时间: 2008-2-1 21:10
哇噻,slore大大,你太酷了。。。。

不好意思,我想问一下Mixlen功能可以吗?
作者: slore     时间: 2008-2-1 21:28
MsgBox MixLen("我是Slore")    '返回结果9。


'MixLen把中文按2个长度,数字e文和一些符号
'(常见的字符的ASCII码都是在0~128以内的)
'按1个长度处理。
Function MixLen(StrExp)
   
Dim i,c
    For i = 1 To Len(StrExp)
        
c = Asc(Mid(StrExp, i, 1))
        
If Not (C >= 0 And C < 128) Then MixLen  = MixLen + 1
        MixLen  = MixLen + 1
    Next
End Function

作者: dhlmdsnw     时间: 2008-2-1 21:33
哇噻。。。酷毙了耶!!!——大大真棒!
先学习再收藏!——牢牢记住了!

小声说一句:slore大大,小妹开了一个新帖,过去窜个门吧!

고 맙 습 니 다 !

http://www.cn-dos.net/forum/view ... 7490&sid=eXmTWk