返回列表 发帖
回复 13# CrLf


不大可能出现错误的断行 - -

实际情况是 db2导出del文件,中间某个字段的某条记录中可能包含有换行符,然后就出现了我说的情况
本来应该在导出的时候,或者直接在数据库层面就能直接解决。但现在的实际情况是。。需要我们自己通过操作这个del文件来解决
0 0 蛋疼的不行

TOP

回复 15# 依山居

谢了~  可用~

遍历路径下所有的del文件我就自己百度好了~

TOP

回复 17# qq253040425


    自己学一学正则表达式式啦。sed 和fr都是支持正则找查替换的工具。
下载安装python3 https://www.python.org/downloads/ 代码存为xx.py 双击运行或IDLE打开F5运行

TOP

本帖最后由 qq253040425 于 2015-11-18 17:40 编辑

回复 18# 依山居


谢谢大神帮助,已搞定!虽然主体部分的逻辑完全看不懂!但是测试能用了! 用百万级的.del文件测试过了,没啥问题的样子
import os
import time
import datetime
print (time.strftime("%Y-%m-%d %H:%M:%S %p", time.localtime()))
print ('Check start, remove the ok file ... ')
lst_last=datetime.date(datetime.date.today().year,datetime.date.today().month,1)-datetime.timedelta(1)
workdir='D:\\IMPDATA\\FTPFILE\\'+lst_last.strftime('%Y-%m-%d')+'\\cqcs\\817'
okfile=workdir+'\check.ok'
if os.path.exists(okfile):
    os.remove(okfile)
newtxt=[]
for dirpath,dirs,files in os.walk(workdir):
   
    for file in files:
        
        if os.path.splitext(file)[1] == '.del':
            
            vfname=os.path.join(dirpath,file)
            print ('Check file: ' + vfname)
            
            with open(vfname) as f:
                txt=f.readlines()
                txt=[r.rstrip() for r in txt]
                rn=len(txt)
                print("Rowscount:",rn)
                newtxt=[txt[r-1][:]+txt[r][:] if ( ('\"' not in txt[r][0]) )  else txt[r]  for r in range(rn) ]
                newtxt=[r+"\n" for r in newtxt if r.count('\"')%2==0]
                f.close()
               
            nfname= vfname+'_new'            
            with open(nfname,"w+") as f:
                f.writelines(newtxt)
                f.close()
               
            os.remove(vfname)
            os.rename(nfname,vfname)
print ('Check over, touch the ok file ...')
with open(okfile,'w+') as f:
    f.writelines('')
    f.close()
print (time.strftime("%Y-%m-%d %H:%M:%S %p", time.localtime()))         COPY

TOP

你倒是真NB。
下载安装python3 https://www.python.org/downloads/ 代码存为xx.py 双击运行或IDLE打开F5运行

TOP

回复 20# 依山居


我在官网下载的64位的python3.5 = = 能不能教下如何封装exe

TOP

回复 21# qq253040425

其中我也不会。自己百度啦。
就是打包成EXE

你用python mini打包成exe也可以。
下载安装python3 https://www.python.org/downloads/ 代码存为xx.py 双击运行或IDLE打开F5运行

TOP

外部命令可用不
sed -ni ":a;$!N;/\n[^\"].*/s/\n//;ta;P;D" *.txtCOPY

TOP

@if (0)==(0) echo off
cscript //nologo //e:jscript "%~0" < a.txt > b.txt
pause & exit
@end
var s = WSH.StdIn.ReadAll().replace(
    /("[^"]*?)[\r\n]+([^"]*")/g,
    function(s0,s1,s2){if (s1+s2=='""'){return s0}else return s1+s2}
)
WSH.Echo(s)COPY

TOP

本帖最后由 依山居 于 2015-11-18 10:16 编辑

从楼主给的例子看,我的代码可靠性差啊。我的代码判断的是不以“结尾的行与下一行连接。
第二行不以“开头,但是第一行”结尾。
下载安装python3 https://www.python.org/downloads/ 代码存为xx.py 双击运行或IDLE打开F5运行

TOP

回复 13# CrLf


不好意思 - - 真的出现这种断行了

但是数据是正常的数据,不是错误数据

TOP

本帖最后由 qq253040425 于 2015-11-18 11:38 编辑

回复 25# 依山居

大神!!
    出现问题了。。

数据中有
"LS81702201409060006659","20",,"817029700","817029700","2","9","",,,,,
不以“结尾,以,结尾的数据,这样的子的数据是正确的数据,

Traceback (most recent call last):
  File "F:\BAT\tt\check_del_here.py", line 29, in <module>
    newtxt=[txt[r][:]+txt[r+1][:] if ('\"' not in txt[r][-1]) else txt[r] for r in range(rn) ]
  File "F:\BAT\tt\check_del_here.py", line 29, in <listcomp>
    newtxt=[txt[r][:]+txt[r+1][:] if ('\"' not in txt[r][-1]) else txt[r] for r in range(rn) ]
IndexError: list index out of range

TOP

回复 27# qq253040425


    下次再提问传实际文件,敏感信息用其它字替换掉就行。

我不熟悉db2 的del文件格式。
导出的数据,固定是多少列?
下载安装python3 https://www.python.org/downloads/ 代码存为xx.py 双击运行或IDLE打开F5运行

TOP

回复 28# 依山居


    嗯 谢谢提醒

del文件的内容和我那个txt的内容是一样的,del其实也是文本文件

我觉得固定列数并不科学,我感觉

newtxt=[txt[r][:]+txt[r+1][:] if ('\"' not in txt[r][-1]) else txt[r] for r in range(rn) ]
newtxt=[r+"\n" for r in newtxt if '\"' in r[0]]

这一段修改一下,因为实际文件中的错误情况只有一种: n行的最后一个字段不以”结尾且n+1行不以”开头

TOP

回复 29# qq253040425

我直觉认为。这货要能正常工作必须固定列。
下载安装python3 https://www.python.org/downloads/ 代码存为xx.py 双击运行或IDLE打开F5运行

TOP

返回列表