中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]通过原始文本文件转换成另一种格式的文本文件
« [1] [2] [3] »
作者:
标题: [求助]通过原始文本文件转换成另一种格式的文本文件 上一主题 | 下一主题
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 31 楼』:  

PS:vbs的速度应该很快……具体多少我没有数据,你自己测试下吧。

2008-2-1 03:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dhlmdsnw
初级用户





积分 127
发帖 59
注册 2008-1-29
状态 离线
『第 32 楼』:  

非常感谢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全选后,蓝色的光幕是填满每一行,没有任何的空白,每一行的字节在文本文件中应该是相等的。
还请大大继续帮我改善这个代码!

고 맙 습 니 다 !!

2008-2-1 11:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 33 楼』:  

会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



2008-2-1 12:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dhlmdsnw
初级用户





积分 127
发帖 59
注册 2008-1-29
状态 离线
『第 34 楼』:  

sorry,大大,小妹的VBA也是很菜的啦。。。刚入门啊。。。还在学当中啊。。。不能说会啊。。。也是半路出家啊。。。刚学了三个月,前面都是教在Excel中怎么操作,到目前才学到文本导入导出这方面的知识啊。。。还未试,听了大大的教训,惶恐中。。。先回了大大。。
努力学习中。。。以后还要大大继续帮助啊!
测试中。。。
고 맙 습 니 다 !!

2008-2-1 12:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dhlmdsnw
初级用户





积分 127
发帖 59
注册 2008-1-29
状态 离线
『第 35 楼』:  

报告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大大对我帮助。。请大大务必在以后继续给我以帮助。。。谢了先!

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

고 맙 습 니 다 !!

努力学习中。。。。

2008-2-1 18:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 36 楼』:  

那个中文的我本来想问呢。就觉得怪怪的。

不过你那样都*2了,如果是e文的就不对了……
不过应该都是中文吧。。。。

2008-2-1 18:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dhlmdsnw
初级用户





积分 127
发帖 59
注册 2008-1-29
状态 离线
『第 37 楼』:  

是的,目前实际操作当中都还只是中文,如果出现e文呢?——大大可有改进的通用版可以给我吗?。。。。嘿嘿。。。不要怪我贪心啊。。。

고 맙 습 니 다 !!

2008-2-1 19:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 38 楼』:  

甚至支持中英混合名...汗~应该没有吧。
只该了一个地方,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



2008-2-1 19:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dhlmdsnw
初级用户





积分 127
发帖 59
注册 2008-1-29
状态 离线
『第 39 楼』:  

哇噻,slore大大,你太酷了。。。。

不好意思,我想问一下Mixlen功能可以吗?

2008-2-1 21:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 40 楼』:  

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


2008-2-1 21:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dhlmdsnw
初级用户





积分 127
发帖 59
注册 2008-1-29
状态 离线
『第 41 楼』:  

哇噻。。。酷毙了耶!!!——大大真棒!
先学习再收藏!——牢牢记住了!

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

고 맙 습 니 다 !

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

2008-2-1 21:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: