标题: 通过固定标志将文本内容分别导入两个不同的文本文件
[打印本页]
作者: dhlmdsnw
时间: 2008-1-31 22:35
标题: 通过固定标志将文本内容分别导入两个不同的文本文件
我有一个原始文件,简称:a文件。文件内容如下:
1203145 1406604301101852880 000000000166000 352101196106237411 康万梓 20080131000106501080001621 797422 01090600
1203271 1406049801101094958 000000004321800 350702196305151378 郑荣华 20080131000106501080000133 797422 01090600
1204272 13900100460040248 000000000250000 35210119670919422X 杨小兰 20080131000106501080001974 797422 02090600
固定标志很简单,先看第一行的数字末尾是01090600 (我为什么拉这长的空白呢?因为空白不能没有,在分别导入的时候也要有空白,也就是说每一行的内容、格式都不能改变),第二行也是01090600 而第三行是02090600 (相信大大们已经看出固定标志是什么了,没错就是1和2!),现在希望大大们能够帮我把出现1标志的所在行一整行全部导入a1文本文件。而出现2标志的所在行一整行全部导入a2文本文件。
实在是麻烦大家了,可能问题对大大们来说很简单,可是对于我来说真是头痛死了,因为以前都是学VBA的,虽然用代码能够解决,但我想大大跟我想的是一样的,我们要想成为一个高手,就应该用更直接的方法,一步到位,所以我现在也在很努力的学批处理。。。但还只是刚入门而已,希望大大们多多帮我啊。。。。고 맙 습 니 다 !(谢谢!)。。。
[
Last edited by dhlmdsnw on 2008-1-31 at 11:04 PM ]
作者: slore
时间: 2008-1-31 23:04
@echo off
for /f "tokens=1-7,8,*" %%i in (a.txt) do (
if %%p==01090600 (echo %%i %%j %%k %%l %%m %%n %%o %%p
>>a1.txt) else (echo %%i %%j %%k %%l %%m
%%n %%o %%p >>a2.txt)
)
pause>nul
空格太多没有办法。。。
VBA多好用。。。非要用BAT?
BAT的处理字符没有那个强。
作者: junchen2
时间: 2008-1-31 23:20
C:\Documents and Settings\wjc\桌面>awk "{if($8 == 01090600){print $0 >> \"1.txt\
"} else {if($8 == 02090600){print $0 >> \"2.txt\"}}}" test.txt
作者: dhlmdsnw
时间: 2008-1-31 23:29
二楼的大大,我的原始文本(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
你在帮助看看啊。。。
你说得没错,VBA在日常办公中特别是Excel、Word、PowerPoint等方面可以取得很好的效果,但对处理文本文件之间的转换毕竟稍弱,简单的说我还得打开一个Excel或者Word才能处理,虽然我是一女子,但我也很享受那种秒杀的快乐。。。呵呵。。。轻轻双击一下,一切搞定啊!
还请大大们多多帮忙看看啊。。。。
谢了先!
[
Last edited by dhlmdsnw on 2008-2-1 at 12:14 AM ]
作者: dhlmdsnw
时间: 2008-1-31 23:34
三楼的大大,你那个代码怎么用啊?
能完整的写一个给我吗?
——唉。。。可怜我这超级新手啊。。。。。
拜托了。。。
作者: 3742668
时间: 2008-1-31 23:39
@echo off
findstr /c:" 01090600 " test.txt>>a1.txt
findstr /c:" 02090600 " test.txt>>a2.txt
start a1.txt
start a2.txt
goto :eof
作者: dhlmdsnw
时间: 2008-2-1 00:06
六楼的版主。。。你的代码我用了一下,是生成了a1和a2,但里面空空的什么都没有啊。。。而且我看了你的代码:你应该是用"01090600"和"02090600"为标志来区分的吧,可是我在实际应用中只能以它们的第二位数"1"和"2"来做为标志来区分啊。。。因为090600还属于会变动的数据。。。还会出现090400、090500等等。。。能不能再帮我想想啊。。。大虾。。。拜托了。。。
在此先要感谢各位大大们的关注,请继续给予新人支持啊。。。谢了先!
期待中。。。
作者: 3742668
时间: 2008-2-1 00:28
要想更精确,可以用:
@echo off
del a1.txt a2.txt 2>nul
findstr /rc:" 01...... " test.txt>>a1.txt
findstr /rc:" 02...... " test.txt>>a2.txt
start a1.txt
start a2.txt
goto :eof
作者: junchen2
时间: 2008-2-1 00:31
@echo off
findstr "\<01090600\>" test.txt>>a1.txt
findstr "\<02090600\>" test.txt>>a2.txt
start a1.txt
start a2.txt
goto :eof
作者: slore
时间: 2008-2-1 00:39
::那代码就简单多了……只要判断第165字符是不是1就可以了。
::因为是从0开始算字符起点,所以下面代码出现的是164
@echo off
for /f "delims=" %%i in (a.txt) do (
Set LineStr=%%i
Call :WriteStr
)
echo 处理完毕!
pause>nul
exit
:WriteStr
if %LineStr:~164,1%==1 (echo %LineStr%>>a1.txt) else (echo %LineStr%>>a2.txt)
那你可以使用VBS脚本……
思路一样。。。
你会VBA的话,下面的代码能看懂吧?
If Mid(linestr,165,1
) = "
1"
Then
append2file
(linestr,"
a1.txt"
)
Else
append2file
(linestr,"
a2.txt"
)
End If
'其中append2file是一个追加到文本的函数。
作者: slore
时间: 2008-2-1 00:45
如果你其他数据有01,02的话,用我的代码
只要你的其他数据没有01,02开头的用3742668的代码,用findstr的确简单不少。。
作者: dhlmdsnw
时间: 2008-2-1 00:57
哇噻。。。感谢8楼、10楼、11楼的大大门,真的是条条道路通罗马啊。。。又学了很多,特别感谢9楼和11楼的大大,8楼大大给予了很大的关注。。。并最终给出了解决方案。。。11楼的大大写的VBA代码比我要精练的多,又学了一招。。。这个终于解决了。。。非常感谢。。。。Thanks!。。。以后多多努力学习,不辜负大大们的努力栽培。。。。
我这边还有个不情之请,我在论坛上还有两个帖子没有解决,也请帮我看看啊。。。
标题分别为:通过原始文本文件转换成另一种格式的文本文件。还有:删除文本文件中的特殊字符但保持格式不变。
http://www.cn-dos.net/forum/view ... ge=1&highlight=
http://www.cn-dos.net/forum/view ... ge=1&highlight=
所使用的a文件的规则跟本帖是一样的!
고 맙 습 니 다 !
[
Last edited by dhlmdsnw on 2008-2-1 at 01:10 AM ]
作者: slore
时间: 2008-2-1 03:40
감사합니다
貌似意思差不多。。。汗~下次说中文。。。
不是韩文的系统吧?
作者: dhlmdsnw
时间: 2008-2-2 00:13
出现新情况了:还是中文捣的鬼。。。如果不是出现三个字名字而是出现两个字或者四个字或者e文字或者中英混合,那个1标志就不在第164位了。——给个通用版批处理吧。。。。因为我刚才试了好多方法就是达不到效果,可不是懒啊。。。。谢了先!大大原来的代码如下:
::那代码就简单多了……只要判断第165字符是不是1就可以了。
::因为是从0开始算字符起点,所以下面代码出现的是164
@echo off
for /f "delims=" %%i in (a.txt) do (
Set LineStr=%%i
Call :WriteStr
)
echo 处理完毕!
pause>nul
exit
:WriteStr
if %LineStr:~164,1%==1 (echo %LineStr%>>a1.txt) else (echo %LineStr%>>a2.txt)
对了,韩文的谢谢有多种说法,我的是带敬语的说法啦!——偶也是超级韩迷。。。嘿嘿。。。。
[
Last edited by dhlmdsnw on 2008-2-2 at 12:14 AM ]
作者: dhlmdsnw
时间: 2008-2-2 00:18
如果方便slore大大也给个vbs完整版的吧。。。让我能够学得更多一点啊。。。因为毕竟VBA我才刚对Excel的平台上操作有点熟悉而已啊。。。还很初级的。。고 맙 습 니 다 !
[
Last edited by dhlmdsnw on 2008-2-2 at 12:19 AM ]
作者: slore
时间: 2008-2-2 02:12
刚才玩了下游戏没有看到。。。恩,睡觉了。
思路是前面怎么变不管了,后面格式占位固定,
那么它应该是倒数第59位。。。你的数据没有体现
出来,我也不知道对不对。你先试验下吧。
Example3.vbs: Quote: |
Const ForReading = 1 '设定打开文本方式为读取
Const ForWriting = 2 '设定打开文本方式为写入
Const ForAppending = 8 '设定打开文本方式为追加
Const InFile = "a.txt" '设定打开的文本
Dim i,Sum
Dim StrLine,OutStr1,OutStr2
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 '如果不是空行
'MsgBox Mid(StrLine,Len(StrLine) - 58,1) 测试用的(已注释掉)。
If Mid(StrLine,Len(StrLine) - 58,1) = "1" Then '倒数应该对的吧?
OutStr1 = OutStr1 & StrLine & vbCrLf
Else
OutStr2 = OutStr2 & StrLine & vbCrLf
End If
End If
Loop
objFile.Close '关闭文件对象
Set objFile = objFSO.OpenTextFile("a1.txt", ForWriting,True)
objFile.Write OutStr1
objFile.Close
Set objFile = objFSO.OpenTextFile("a2.txt", ForWriting,True)
objFile.Write OutStr2
objFile.Close
Set objFile = Nothing
Set objFSO = Nothing |
|
[
Last edited by slore on 2008-2-2 at 02:13 AM ]
作者: dhlmdsnw
时间: 2008-2-2 02:24
天哪,,,,大大。。。你可总算来了。。。。我等得快晕过去了。。。有没有QQ啊。。。回头加一个啊,因为随时会有特殊情况出现啊。。。——再说反正我吃定你了!!!。。。。嘿嘿。。。——你一定要教我!——大大你几岁了,还玩游戏?真晕!。。。已经试了。。。搞定!!!——大大出马,一个顶俩!嘿。。。
고 맙 습 니 다 !
终于可以睡觉觉咯。。。。
作者: slore
时间: 2008-2-2 02:31
。。。。。。女孩子。。。。真的很可怕。。。
作者: terse
时间: 2008-2-2 19:05
我也来一个 不知对上不
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (aa.txt) do (
set scr=%%i
set n=!scr:~164,1!
>>a!n!.txt echo %%i
)
pause