[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 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文件测试过了,没啥问题的样子
  1. import os
  2. import time
  3. import datetime
  4. print (time.strftime("%Y-%m-%d %H:%M:%S %p", time.localtime()))
  5. print ('Check start, remove the ok file ... ')
  6. lst_last=datetime.date(datetime.date.today().year,datetime.date.today().month,1)-datetime.timedelta(1)
  7. workdir='D:\\IMPDATA\\FTPFILE\\'+lst_last.strftime('%Y-%m-%d')+'\\cqcs\\817'
  8. okfile=workdir+'\check.ok'
  9. if os.path.exists(okfile):
  10.     os.remove(okfile)
  11. newtxt=[]
  12. for dirpath,dirs,files in os.walk(workdir):
  13.    
  14.     for file in files:
  15.         
  16.         if os.path.splitext(file)[1] == '.del':
  17.             
  18.             vfname=os.path.join(dirpath,file)
  19.             print ('Check file: ' + vfname)
  20.             
  21.             with open(vfname) as f:
  22.                 txt=f.readlines()
  23.                 txt=[r.rstrip() for r in txt]
  24.                 rn=len(txt)
  25.                 print("Rowscount:",rn)
  26.                 newtxt=[txt[r-1][:]+txt[r][:] if ( ('\"' not in txt[r][0]) )  else txt[r]  for r in range(rn) ]
  27.                 newtxt=[r+"\n" for r in newtxt if r.count('\"')%2==0]
  28.                 f.close()
  29.                
  30.             nfname= vfname+'_new'            
  31.             with open(nfname,"w+") as f:
  32.                 f.writelines(newtxt)
  33.                 f.close()
  34.                
  35.             os.remove(vfname)
  36.             os.rename(nfname,vfname)
  37. print ('Check over, touch the ok file ...')
  38. with open(okfile,'w+') as f:
  39.     f.writelines('')
  40.     f.close()
  41. print (time.strftime("%Y-%m-%d %H:%M:%S %p", time.localtime()))         
复制代码

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

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

TOP

  1. @if (0)==(0) echo off
  2. cscript //nologo //e:jscript "%~0" < a.txt > b.txt
  3. pause & exit
  4. @end
  5. var s = WSH.StdIn.ReadAll().replace(
  6.     /("[^"]*?)[\r\n]+([^"]*")/g,
  7.     function(s0,s1,s2){if (s1+s2=='""'){return s0}else return s1+s2}
  8. )
  9. WSH.Echo(s)
复制代码

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

返回列表