中国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] »
作者:
标题: [求助]通过原始文本文件转换成另一种格式的文本文件 上一主题 | 下一主题
dhlmdsnw
初级用户





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

各位大大加油啊。。。人名问题及最后一行汇总行问题谁能帮我处理一下啊。。。
小妹急切盼望中。。。。

2008-1-30 00:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 17 楼』:  

因为中英文空格 人名问题没解决
@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 ]



简单!简单!再简单!
2008-1-30 02:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dhlmdsnw
初级用户





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

先感谢terse大虾的大力帮助,我还没试,只不过一回来就看见大大给我回了帖就感激万分!

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

再次感谢terse大大!!!

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





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

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全选后,蓝色的光幕是填满每一行,每一行没有任何的空白。
还请大大继续帮我改善这个代码!
在此万分感谢!!!

2008-1-30 14:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 20 楼』:  

重新改一下 不知有效果否?
@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=



简单!简单!再简单!
2008-1-30 21:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dhlmdsnw
初级用户





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

哇。。。。耶耶耶。。。。
terse大大,我爱死你了!——耶耶耶。。。。。
什么没得说,就一句话感谢。。。我有得说。。。。非常感谢。。。고 맙 습 니 다 !
太好了。。。我对你的景仰真得如涛涛江水,绵绵不绝。。。如雷贯耳。。。哇噻。。。简直太棒了。。。。丫丫丫。。。。
——不过不知道会不会乐极生悲,明天拿到公司去试一下手。。。嘿嘿。。。每天都会要处理这样的东东。。好多丫。。。。我真是太感谢了!。。。大大万岁。。。。!!!!

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





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

哇噻,如果明天一下子双击一秒钟搞定,不知道那些人会拿什么眼光看我,会不会也对我景仰得如涛涛江水、绵绵不绝啊。。。想得都流口水了。。。。嘿嘿。。。terse大大,你不介意我在我的同事面前小秀一把吧。。。呵呵。。当然在论坛上我可不敢乱说。。。呵呵。。。耶耶耶。。。。成功。。成功。。。今天可以好好吃点东西。。睡个好觉。。。逛个好街了。。。大大的功劳最大!
同样也要感谢所有关注本帖的各位大虾,고 맙 습 니 다 !(谢谢!)。。。
啦啦啦。。。。。。

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





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

terse大大,小小声的跟你说一下,我在论坛上还有一个帖子没解决。。。你看你老是不是休息两天。。。再到我那边看看啊。。。。嘿。。。怪不好意思的。。。。帖子的标题是“删除文本文件中的特殊字符但保持格式不变”,发了一两天了,都没人给个框架。。。。。当然你得好好休息一下。。。。期待中。。。。嘿嘿。。。http://www.cn-dos.net/forum/view ... ge=1&highlight=

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





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

天哪,乐得没边没谱了,忘了问一句:terse大大,你的代码支持外国名字不?

2008-1-30 21:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 25 楼』:  



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

你试一下吧  应该可以



简单!简单!再简单!
2008-1-30 21:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dhlmdsnw
初级用户





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

说真的大大,我只学了一些最容易的VBA,都写好代码了,但是要经过Excel转换,我后来一想,为什么我不能直接一点呢,到后面翻了好多资料才约略懂得可以通过批处理进行直接转换。。。可是看了一些批处理的教学资料。。。感觉如果要解决还需要很多的时间。。。因此就上了这个论坛。。。通过学习你的代码。。。特别是一步一步解决我的问题。。。让我学到了许多有用的东西。。。我会进一步学习的。。。谢谢大大的支持!!!

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





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

terse大大:经过测试:测试样本如:潘迪特·辛格、Tom Marvolo Riddle、特里帕蒂·辛格。中文的名字都没问题,如果是外国的名字,转换后就变成Tom了,后面的都没了,成空白了。。。没关系。。。以后我通过努力学习会把terse大大的这个模型给完善的,大大不用操心了。。。。总得留一点作业让我这后辈有一点东西可做嘛。。。什么事都让你亲自出马,那多不好啊。。。高手总得用在刀刃上。。嘿嘿。。。。大大休息完有空了,可要到我的另一张帖子上看看啊。。。谢了先!。。。呵呵。。。

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





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

大大,太奇怪了。。。。我用了你的代码双击完。。。什么反应都没有?也没生成:14080005020080131001.txt文件,真是太奇怪了,什么事情都没发生?是不是我的电脑有问题啊。。。在家我是用XP,在公司是用2000。——我是先通过一个批处理,里面代码:copy *.txt /b a.txt /b。汇总生成一个a.txt文件,然后再用大大的代码,双击完就什么都没发生了?——大大再帮助看看啊。。。。

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





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

我终于懂了。。。。原来是我原始文件行数较多,它要处理将近15秒呢。。。最后才生成的。。。。唉,真晕,我这没基础的人。。。
不过大大,还是出现了一个变数,还请帮助我解决一下。。。。
问题是:b文件中每一行(除了最后一行)前面的:140800050202是固定的,后面1407002601001238877是变动的,来源于a文件,但a文件中这个地方数字的最后如果出现非数字符号如*号(像这样1407002601001238877*),请帮助去掉,不是用空白来替换,也不是后面的空白往前整。而是实实在在的删除一个字节的意思。可以吗?——先谢了!!——还请大大们也继续关注啊。。。
期待中。。。。

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





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

本来打算睡觉,还是写完算了(有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了... -。-

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


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



论坛跳转: