Board logo

标题: 通过固定标志将文本内容分别导入两个不同的文本文件 [打印本页]

作者: 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