标题: [求助]删除文本文件中的特殊字符但保持格式不变
[打印本页]
作者: dhlmdsnw
时间: 2008-1-29 23:46
标题: [求助]删除文本文件中的特殊字符但保持格式不变
有一原始文本文件,简称a,文件名:01067-01090800-080122-01.txt,文件内容及格式如下:
1147666 1307002601001238877 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 13-7002501000591114 000000000250000 352202800608331 陈爱国 20080122000106701080000963 797503 01090800
1148256 1407700601101953789 000000000250000 352201197301142639 吴丽玉 20080122000106701080001017 797503 01090800
a文件的每一行都是从114开始的,在第二个114的前面有一个黑色高亮的小方块(类似于光标固定往右拖一个字节的效果,只不过它是黑色的)来做为分隔符。
现在要求如下:每一行前面1147666 (包括空白)与原文件相同,再后面1307002601001238877有变动(要求是这样变动的:如果前面是以13或者13-开头的,请删掉13或者13-,后面的数据往前整,但要在该行的末尾补上相应的空白数,如删掉的是13,补两个空白,如删掉的是13-,补三个空白。如果前面不是以13或者13-开头的则保持不变。),再后面的所有数据都不变。最后生成一个新的文本文件,简称b,文件名为:sm080129。文件名中前面的sm固定不变,后面的080129是当天日期。在本例中第一行有一个13,第六行有一个13-。
恳请各位大侠再次出手相助。。。不胜感谢!!!
作者: dhlmdsnw
时间: 2008-1-29 23:57
sorry,描述错了一个地方,删除了13或者13-以后,不是在该行的末尾补空白,是后面的数据往上整,再补上二至三个空白,例如本例第一行:1307002601001238877,删除13后是07002601001238877 (后面补了两个空白)
再例如本例的第六行:13-7002501000591114,删除13-后是7002501000591114 (后面补了三个空白)——各位大虾都来帮忙试试手啊。。。谢了先!
作者: dhlmdsnw
时间: 2008-1-30 14:49
各位大大怎么都不帮我看看啊?是不屑出手还是有其他问题啊。。。如果是我没有描述清楚,请告诉我,我会继续说明的。。。版主救命啊。。。。小妹这里谢了先!
作者: fastslz
时间: 2008-1-30 15:27
可能是1307002601001238877也有可能出现这个13-7002501000591114
没有规律版主也帮不了你,写出不具通用性代码给你也是吃力不讨好。
作者: qzwqzw
时间: 2008-1-30 15:46
对于这种一次性操作的文件
我会选用Editplus或者UltraEdit的正则替换
而不是用批处理
作者: dhlmdsnw
时间: 2008-1-30 17:21
回复4楼的大大,先感谢你的关注,但我个人认为应该是有规律的,就是a文件要转换为b文件,但是有一个条件需要判断一下:就是在每一行的固定位置是否出现13或者13-,如果出现,则把13或者13-删除,后面的数据往前整,在该位置后面的第一个空白处补上相应的空白数(例如删掉的是13,那么补两个空白,如果删掉的是13-,那么就补三个空白),注意不是在该行的末尾补上相应的空白数!
还可以用替换来理解:就是如果出现13或者13-,那么用相应的空白来替代,只不过这个空白不是放在对应的位置,而是放在该位置后面第一个出现空白的地方。
如果每一行固定位置不是13或者13-,那么该行保持不变。
最后就是b文件的命名需要体现当天日期。
还是恳请各位大大再帮小妹多多看看,谢了先!
作者: dhlmdsnw
时间: 2008-1-30 17:24
回复5楼的大大,说实在的你说的两种东东我都是第一次听说,只要你能帮我解决,无论什么样的方法我都愿意尝试的,当然首先大大的得有耐心教我啊。。。——能写一个具体的步骤给我吗?——非常感谢你的关注!
还请继续给我支持。。。
作者: terse
时间: 2008-1-30 22:19
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2*" %%i in (a01.txt) do (
set src=%%i
set src1=%%j
if "!src1:~0,2!" == "13" set src1=!src1:~2!
if "!src1:~0,1!" == "-" set src1=!src1:~1!
>>sm%date:~0,4%%date:~5,2%%date:~8,2%.txt echo !src!!src1!%%k
)
pause
[
Last edited by terse on 2008-1-30 at 10:26 PM ]
作者: dhlmdsnw
时间: 2008-1-30 22:25
哇噻。。。。大大大。。。大虾。。。你什么时候过来的,通知一声嘛。。。我还在努力测试你说的外国名字呢。。。刚给你回了。。。。还没试试代码,但看到大大简直是感激涕零了。。。。小妹这就试试去。。。大大出手。。。简直。。。。唉。。。无语了。。。测试先。。。嘿嘿。。。。
作者: terse
时间: 2008-1-30 22:28
你说的外国名 因为有空格 所以没办法
作者: dhlmdsnw
时间: 2008-1-30 22:39
大大,我今晚不用睡觉了,简直太兴奋了。。。。天哪。。。我要马上去系统的学习批处理。。。不懂的地方,大大可要教我啊。。。没得说了。。。一次通过。。。简直是神了。。。。明天我的那些同事会睁大着眼睛。。。看我把它们一个个都秒杀了。。。然后她们会流着口水呆望着我。。。。就像我现在呆望着大大的五颗星。。。呵呵。。。。。大大我要去告诉全世界,哇噻,我的terse大大真的好厉害哦。。。。耶耶耶。。。。基本上所有的东东都可秒杀啊。。。嘿嘿。。。
作者: dhlmdsnw
时间: 2008-1-30 22:43
唉,看我这兴奋的,连最基本的礼貌都忘了:고 맙 습 니 다 !
terse大大,回头我如果还有帖,你可别忘了关注哦。。。耶耶耶。。。。
再次感谢关注本帖的所有大虾。。。有了你们的关注。。。我们这些新人才有希望啊!非常感谢!
作者: dhlmdsnw
时间: 2008-1-31 11:55
大大今天在公司试了一下,出现错误了。。我双击完批处理命令DOS窗口出现下面的提示:'00-0.txt' 不是内部或外部命令,也不是可运行的程序或批处理文件。这样提示出现了十多行,然后生成了一个文件名为:sm星期四。的文件,但没有扩展名(我没有隐藏文件扩展名),我把它添加上.txt的扩展名打开后,里面是空空的。——我不知道这是不是跟电脑有关,我在家用的是XP,在公司用的是2000。
还请再帮助看看。。。。谢了先!
作者: dhlmdsnw
时间: 2008-1-31 21:53
我弄整齐点,大大们容易看
原始文件如下:
1204120 13540901100139621 000000000250000 360424196403255318 周小荣 20080131000106301080003720 718456 02090400
1204412 13510501100178656 000000000109800 522725198207096013 陈德锋 20080131010106301070002361 718456 02090400
1204421 13512101100376604 000000000287800 352623197202250034 熊启林 20080131010106301070003431 718456 02090400
1204438 13531901100106746 000000000609800 350582197009282053 张慈爱 20080131010106301070005309 718456 02090400
1204440 13531500460005694 000000000441200 350582197903116033 林逸作 20080131010106301070005313 718456 02090400
1204476 13520900460000898 000000000229200 35052119820304451X 陈越明 20080131010106301070008444 718456 02090400
1204477 13520900460000898 000000000146800 35052119820304451X 陈越明 20080131010106301070008458 718456 02090400
1204478 6228480682158549217 000000000230900 350500197805131016 吴毓志 20080131010106301070009032 718456 02090400
1204479 9559980681087816614 000000000121300 350521197003264513 吴明杰 20080131010106301070007548 718456 02090400
1204480 9559980681087816614 000000000164400 350521197003264513 吴明杰 20080131010106301070007935 718456 02090400
1204481 9559980071104379814 000000000375200 350521690601453 周明海 20080131010106301070008412 718456 02090400
1204532 13520901100030907 000000000315900 350521197204164551 王惠民 20080131010106301060032660 718456 02090400
1204533 13521400460006275 000000000431000 350521197111201536 陈亚清 20080131010106301060031118 718456 02090400
1204534 9559980681813380216 000000000267600 350521740504453 陈桂林 20080131010106301060031827 718456 02090400
用terse大大代码转换后出现以下格式:
1204120 540901100139621 000000000250000 360424196403255318 周小荣 20080131000106301080003720 718456 02090400
1204412 510501100178656 000000000109800 522725198207096013 陈德锋 20080131010106301070002361 718456 02090400
1204421 512101100376604 000000000287800 352623197202250034 熊启林 20080131010106301070003431 718456 02090400
1204438 531901100106746 000000000609800 350582197009282053 张慈爱 20080131010106301070005309 718456 02090400
1204440 531500460005694 000000000441200 350582197903116033 林逸作 20080131010106301070005313 718456 02090400
1204476 520900460000898 000000000229200 35052119820304451X 陈越明 20080131010106301070008444 718456 02090400
1204477 520900460000898 000000000146800 35052119820304451X 陈越明 20080131010106301070008458 718456 02090400
1204478 6228480682158549217 000000000230900 350500197805131016 吴毓志 20080131010106301070009032 718456 02090400
1204479 9559980681087816614 000000000121300 350521197003264513 吴明杰 20080131010106301070007548 718456 02090400
1204480 9559980681087816614 000000000164400 350521197003264513 吴明杰 20080131010106301070007935 718456 02090400
1204481 9559980071104379814 000000000375200 350521690601453 周明海 20080131010106301070008412 718456 02090400
1204532 520901100030907 000000000315900 350521197204164551 王惠民 20080131010106301060032660 718456 02090400
1204533 521400460006275 000000000431000 350521197111201536 陈亚清 20080131010106301060031118 718456 02090400
1204534 9559980681813380216 000000000267600 350521740504453 陈桂林 20080131010106301060031827 718456 02090400
问题具体一点的描述是:出现13或者13-的是删除了,后面数据也往前整了,但在后面数据的第一个空白开始增加了4个空白,没有出现13或者13-的行,在后面数据的第一个空白位置也增加了2个空白。(本来应该要有的结果是出现13或者13-的行,后面数据的第一个空白开始增加相应的空白数。没有出现13或者13-的行,该行不变动。)
大大们再帮我看看啊。。。。
谢谢了!
作者: dhlmdsnw
时间: 2008-2-1 02:10
补上原始文本(a文本文件)的规则如下:
序号 数据类型(字节) 名称 备注 累计字节
1 Char(25) 标志1 左对齐,右补空格 25
2 Char(30) 标志2 左对齐,右补空格 55
3 Char(15) 标志3 例如13.2(去掉小数点),右对齐,左补0 70
4 Char(6) 标志4 固定六个空格 76
5 Char(20) 标志5 左对齐,右补空格 96
6 Char(20) 标志6 左对齐,右补空格 116
7 Char(8) 标志7 YYYYMMDD 124
8 Char(1) 标志8 0-代收,1-代付 125
9 Char(1) 标志9 0-首期,1-续期 126
10 Char(20) 标志10 左对齐,右补空格 146
11 Char(20) 标志11 左对齐,右补空格 166
12 Char(20) 标志12 左对齐,右补空格 186
13 Char(40) 标志13 左对齐,右补空格 226
供大大们参考。。。再次多谢各位大大的关注。。。
继续期待中。。。。
[
Last edited by dhlmdsnw on 2008-2-1 at 02:11 AM ]
作者: slore
时间: 2008-2-1 02:26
terse的代码错误原因是因为你的
第2部分字符的长度是不固定的,有些62,95的后面多2位。
(你最开始给的代码没有体现出这个特点,你的14的和13的一样长=.=)
但是感觉13的那些行应该对的呀~
建议你还是用VBS脚本,和VBA的代码差不多。不用打开EXCEL。
方法和那帖子一样。。。因为你格式固定,所以你判断第mid(linestr,26,2)
是不是"13",是替换成空,将55位那个空格换成3个空格,这样就不了1位。
再判断mid(linestr,26,1)是不是"-",是同样替换成空格,将55位的空格替换成2个空格,就补了1位。
作者: slore
时间: 2008-2-1 02:34
把这个问题给你写个VBS脚本的例子:
Example.vbs:
Quote: |
Const ForReading = 1 '设定打开文本方式为读取
Const ForWriting = 2 '设定打开文本方式为写入
Const ForAppending = 8 '设定打开文本方式为追加
Const InFile = "a.txt" '设定打开的文本
Dim StrLine,OutStr
Set objFSO = CreateObject("Scripting.FileSystemObject") '引用FSO对象,读写文件要用到的
Set objFile = objFSO.OpenTextFile(InFile, ForReading) '以读取方式打开InFile
Do Until objFile.AtEndOfStream
StrLine = objFile.ReadLine '读取一行
If Mid(StrLine,26,3) = "13-" Then
StrLine = Left(StrLine,25) & Mid(StrLine,29,27) & " " & Mid(StrLine,56)
ElseIf Mid(StrLine,26,2) = "13" Then
StrLine = Left(StrLine,25) & Mid(StrLine,28,28) & " " & Mid(StrLine,56)
End If
OutStr = OutStr & StrLine & vbCrLf
Loop
objFile.Close '关闭文件对象
OutFile = "sm" & FormatDate(Date) & ".txt"
Set objFile = objFSO.OpenTextFile(OutFile, ForWriting,True) '以写入方式打开OutFile
objFile.Write OutStr
objFile.Close '关闭文件对象
Set objFile = Nothing
Set objFSO = Nothing
Function FormatDate(tDate)
FormatDate = Right(Year(tDate),2) & AddZero(Month(tDate)) & AddZero(Day(tDate))
End Function
Function AddZero(sNum)
Addzero = Right("0" & sNum,2)
End Function |
|
脚本运行的结果表明,你的第一帖里的名字后面的空格少一位,不知道是不是这样。。。
作者: dhlmdsnw
时间: 2008-2-1 12:44
看了slore大大回的帖,感觉自己真是太惭愧了。。。大大还在帮助我写代码。。。我自己却因为太冷,窝进被子了。。。——以后一定要学习slore大大这种诲人不倦,努力钻研的精神。。。
用了大大的代码,已经生成了我需要的格式(与我以前用VBA生成的格式是一样的),能否达到机器的要求,要下午才能知道。。。应该没问题。。。下午我会答复是否可以的。。。还请大大继续关注。。。。谢了先!
真的非常感谢slore大大的照顾!——大大也要继续关注我其他的帖子啊(后面还会再发的,因为现在正在努力学习中。。。。)
同时,我也为自己的知识欠缺感到惭愧。。。居然之前都不知道VBS,现在终于能够懂得VBA也能够还是能够有更多的应用,因为我看到大大写的vbs,感觉比较容易懂,跟我的VBA有共通的地方。
希望大大们继续关注我以后发的其他帖子。。。。
고 맙 습 니 다 !
作者: junchen2
时间: 2008-2-1 13:23
gawk "{sub(/ 13-/,\" \");sub(/ 13/,\" \");print $0}" test.txt
其实一句话就可以基本搞定,^ ^
http://www.vkill.net/tools.html
里面有gawk.exe工具,这个就是处理格式化输出的,是它的强项。
作者: slore
时间: 2008-2-1 13:27
Quote: |
Originally posted by junchen2 at 2008-2-1 13:23:
gawk "{sub(/ 13-/,\" \");sub(/ 13/,\" \");print $0}" test.txt
其实一句话就可以基本搞定,^ ^
http://www.vkill.net/tools.html
里面 ... |
|
3方工具是会简化很多。
那我把a.txt作为参数。。。
1.vbs a.txt
不知道算不算半句话?
作者: junchen2
时间: 2008-2-1 13:32
当然神在心中吗!你说是就是了。
作者: dhlmdsnw
时间: 2008-2-1 18:56
先报告slore大大,你的代码没问题,用得效果很好!——实现秒杀了。。。嘿嘿。。。고 맙 습 니 다 !
另外,谢谢19楼的大大,我在测试中。。我也希望能够学到更多精华的东西。。。也希望大大回头能继续关注我其他的帖子,今晚还会再发一帖的(帖子标题已经想好了,先定为:据原始文件的固定标志给目标文件添加相应标志。。。嘿嘿。。。)
没办法人笨啊。。。学习中。。。
感谢大家支持与关注,本问题已解决,算是结帖了。
고 맙 습 니 다 !
作者: terse
时间: 2008-2-2 22:05
Quote: |
Originally posted by dhlmdsnw at 2008-1-31 21:53:
我弄整齐点,大大们容易看
原始文件如下:
1204120 13540901100139621 000000000250000 360424196403255318 周小荣 20080131000106301 ... |
|
其实 你改一下
echo !src!!src1:~0,30!%%k 就OK了
作者: dhlmdsnw
时间: 2008-2-3 02:04
测试了。。。可以滴。。。谢谢terse大大。。。这两天怎么都没见你啊?
作者: pinghu
时间: 2008-2-3 16:36
你在写字板粘贴试试