Board logo

标题: [文本处理] [已解决]批处理怎样把不以引号开头的行合并到上一行行尾? [打印本页]

作者: qq253040425    时间: 2015-11-16 18:06     标题: [已解决]批处理怎样把不以引号开头的行合并到上一行行尾?

比如有一个文件a.txt内容大致如下:

情景一:
"1","12","123","123
4"
"A","AB","ABC","ABCD"
执行脚本后内容能够修改为
"1","12","123","1234"
"A","AB","ABC","ABCD"

情景二:
"1","12","123","
4"
"A","AB","ABC","ABCD"
执行脚本后内容能够修改为
"1","12","123","4"
"A","AB","ABC","ABCD"

情景三(出现于27L的这种情况属于正确的数据)
"1","12","123",
"A","AB","ABC",

能处理情景一、二、三的代码在19L
就算处理1.7G的测试文件依然很快,但是对于大于等于两个字段有换行符就不能处理了,虽然不会报错,比如下面

情景四:
"1","
12","12
3",,,
"1","12","123",,,
执行脚本后内容修改为
"1","12","123",,,
"1","12","123",,,

能处理情景一、二、三、四的代码在44L和57L
44L的bat+js代码无法处理测试用的文件1.7G,原因未知, win2003的兼容性目前未知
57L的python代码能处测试用的文件1.7G,耗时140s,这应该与机器性能有关,仅作参考




P.S:
1. PyInstaller打包的exe在2003上跑会有问题,老老实实装python的好
2. 本机(win7)装了python3.5_X64编译出来的代码在2003下怎么弄都有问题,2003换python2.7.10_X64可行。X86在读取大文件的时候会报错内存错误
作者: 回家路上    时间: 2015-11-16 20:26

  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3. set line=%%i
  4. set line=!line:"=#!
  5. if "!line:~-1!" neq "#" (
  6. set pre=%%i
  7. ) else echo;!pre!%%i&set pre=
  8. )
  9. pause & exit /b
复制代码

作者: WHY    时间: 2015-11-16 20:27

  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3.     if not "%%~i"==%%i (
  4.         if %%~i#==%%i# (echo;!s!%%i) else set "s=%%i"
  5.     ) else echo;%%i
  6. )
  7. pause
复制代码
  1. @if (0)==(0) echo off
  2. cscript //nologo //e:jscript "%~0" < a.txt
  3. pause & exit
  4. @end
  5. WSH.Echo(WSH.StdIn.ReadAll().replace(/([^"])\r\n/g, '$1'))
复制代码

作者: 依山居    时间: 2015-11-16 22:01

  1. o( ̄▽ ̄)o 2015/11/16 周一21:56:55.21 <( ̄︶ ̄)>
  2. D:\快盘\我写的程序\temp>fr a.txt -ric:(\"[0-9,a-z]+)\r\n -t:"\1" -stdout
  3. "1","12","123","1234"
  4. "A","AB","ABC","ABCD"
  5. "R","RS","RST","RSTU"
  6. "E","EF","EFG","EFGH"
复制代码
不需要跨行匹配也可以。

试了半天。思路是结尾不是“符号就把回车换行替换成空。
http://baiy.cn/utils/fr/index.htm
作者: qq253040425    时间: 2015-11-16 23:15

回复 2# 回家路上

a.txt的内容并没有变
作者: qq253040425    时间: 2015-11-16 23:17

回复 3# WHY


第一段代码执行后a.txt并没有变
第二段。。没看懂~
作者: qq253040425    时间: 2015-11-16 23:19

回复 4# 依山居


    思路是对的,然而  'fr' 不是内部或外部命令,也不是可运行的程序或批处理文件。
作者: 依山居    时间: 2015-11-17 13:20

本帖最后由 依山居 于 2015-11-17 17:07 编辑
  1. """
  2. python把不以引号结尾的行与下一行连接
  3. 题目来源 http://www.bathome.net/thread-38164-1-1.html
  4. 依山居  13:13 2015/11/17
  5. 就是当是练习列表解析用法了
  6. """
  7. newtxt=[]
  8. with open("a.txt") as f:
  9.     txt=f.readlines()
  10.     txt=[r.rstrip() for r in txt]
  11.     rn=len(txt)
  12.     print("总行数:",rn)
  13.     newtxt=[txt[r][:]+txt[r+1][:] if ('\"' not in txt[r][-1]) else txt[r] for r in range(rn) ]
  14.     newtxt=[r+"\n" for r in newtxt if '\"' in r[0]]
  15.     f.close()
  16.    
  17. with open("b.txt","w+") as f:
  18.     f.writelines(newtxt)
  19.     f.close()
复制代码

作者: qq253040425    时间: 2015-11-17 16:18

回复 8# 依山居


Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>
========================== RESTART: F:\BAT\tt\tt.py ==========================
Traceback (most recent call last):
  File "F:\BAT\tt\tt.py", line 11, 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\tt.py", line 11, in <listcomp>
    newtxt=[txt[r][:]+txt[r+1][:] if ('\"' not in txt[r][-1]) else txt[r] for r in range(rn) ]
IndexError: string index out of range
>>>
作者: 依山居    时间: 2015-11-17 16:38

太烦了。
有空行?
作者: qq253040425    时间: 2015-11-17 16:53

回复 10# 依山居


还真有 = = 。。莫名奇妙最后多了一行。。。
作者: qq253040425    时间: 2015-11-17 16:58

回复 10# 依山居


   最后一行的空行。。这个貌似没办法避免。。导出的文本数据文件都有这样的问题。。。可以在脚本里规避掉最后一行空行的问题吗
作者: CrLf    时间: 2015-11-17 17:03

楼主不考虑以 , 结尾的错误断行吗?
作者: 依山居    时间: 2015-11-17 17:08

回复 13# CrLf


    他给的例子也是真实文件,鬼知道他实际数据是怎么样的。
作者: 依山居    时间: 2015-11-17 17:10

回复 12# qq253040425


    代码更新了。
作者: qq253040425    时间: 2015-11-17 17:37

回复 13# CrLf


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

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

回复 15# 依山居

谢了~  可用~

遍历路径下所有的del文件我就自己百度好了~
作者: 依山居    时间: 2015-11-17 18:05

回复 17# qq253040425


    自己学一学正则表达式式啦。sed 和fr都是支持正则找查替换的工具。
作者: qq253040425    时间: 2015-11-17 18:50

本帖最后由 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()))         
复制代码

作者: 依山居    时间: 2015-11-17 19:16

你倒是真NB。
作者: qq253040425    时间: 2015-11-17 19:26

回复 20# 依山居


我在官网下载的64位的python3.5 = = 能不能教下如何封装exe
作者: 依山居    时间: 2015-11-17 19:32

回复 21# qq253040425

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

你用python mini打包成exe也可以。
作者: terse    时间: 2015-11-17 19:57

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

作者: WHY    时间: 2015-11-17 23:49

  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)
复制代码

作者: 依山居    时间: 2015-11-18 10:11

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

从楼主给的例子看,我的代码可靠性差啊。我的代码判断的是不以“结尾的行与下一行连接。
第二行不以“开头,但是第一行”结尾。
作者: qq253040425    时间: 2015-11-18 11:30

回复 13# CrLf


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

但是数据是正常的数据,不是错误数据
作者: qq253040425    时间: 2015-11-18 11:33

本帖最后由 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
作者: 依山居    时间: 2015-11-18 12:16

回复 27# qq253040425


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

我不熟悉db2 的del文件格式。
导出的数据,固定是多少列?
作者: qq253040425    时间: 2015-11-18 13:18

回复 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行不以”开头
作者: 依山居    时间: 2015-11-18 13:20

回复 29# qq253040425

我直觉认为。这货要能正常工作必须固定列。
作者: 依山居    时间: 2015-11-18 13:21

回复 29# qq253040425


    你需要把各种情况整理到汇总到帖子里。
作者: 依山居    时间: 2015-11-18 13:22

  1. @echo off
  2. ::依山居 13:01 2015/11/18
  3. ::fr 不带-stdout参数会直接修改原文件,所以复制s.txt为ss.txt运行测试
  4. ::fr 使用-s 可以列举子目录修改匹配的文件。注意做好备份
  5. copy s.txt ss.txt /y
  6. ::以引号结尾,不以引号开头,就删掉回车换行。这个规则好处理测试可行。
  7. fr ss.txt -rnnlic:\"(\r\n)[^\"] -t:
  8. pause
复制代码

作者: qq253040425    时间: 2015-11-18 13:23

回复 30# 依山居


   发现一个解决一个吧
作者: qq253040425    时间: 2015-11-18 13:26

回复 32# 依山居

现在实际情况有那种本行以,结尾第二行以"开头的正确数据
作者: qq253040425    时间: 2015-11-18 13:27

回复 31# 依山居


嗯,这段代码能应付现在的情况后我会整理下的~
作者: qq253040425    时间: 2015-11-18 13:29

回复  依山居

大神!!
    出现问题了。。

数据中有
"LS81702201409060006659","20",,"81702 ...
qq253040425 发表于 2015-11-18 11:33



    主要是27楼这种情况,现在的代码会报错
作者: 依山居    时间: 2015-11-18 13:34

回复 36# qq253040425

也只能这样了。这代码是按你原先说明的规则写的。容错性差是意料之中的。
作者: qq253040425    时间: 2015-11-18 13:50

回复 37# 依山居

好吧,那能不能帮忙解释下

    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]]   

这一段什么意思呢~ 看不明白
作者: qq253040425    时间: 2015-11-18 14:04

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

回复 37# 依山居


    针对27楼的情况

报错的行修改为
newtxt=[txt[r][:]+txt[r+1][:] if ((',' not in txt[r][-1]))  else txt[r] for r in range(rn) ]
能过,但是原来想处理的情况就不行了,用or连击两个条件
newtxt=[txt[r][:]+txt[r+1][:] if (('\"' not in txt[r][-1]) or ('\"' not in txt[r][-1]))  else txt[r] for r in range(rn) ]
也是list out of range,最后再改成
newtxt=[txt[r][:]+txt[r+1][:] if ( ('\"' or ',') not in txt[r][-1])  else txt[r] for r in range(rn) ]
就发现 ('\"' or ',')  这里,谁在前才会生效
作者: 依山居    时间: 2015-11-18 14:19

回复 39# qq253040425


    很难改的。你搜索列表解析
我不会用列表解析作复杂的判断。
作者: 依山居    时间: 2015-11-18 14:21

  1.     newtxt=[txt[r][:]+txt[r+1][:] if ('\"' not in txt[r][-1]) or (',' not in txt[r][-1]) else txt[r] for r in range(rn) ]
复制代码

作者: qq253040425    时间: 2015-11-18 14:42

回复 41# 依山居


    不行 - -  

还有 txt[r][:]是什么意思?
作者: 依山居    时间: 2015-11-18 15:02

txt是一个列表,每个元素是一行。txt[r]表示第r行
txt[r][:]表示第r行的整个内容。
作者: CrLf    时间: 2015-11-18 15:08

本帖最后由 CrLf 于 2015-11-18 18:04 编辑

Bat+JS 来一个
  1. 1>1/* :
  2. @echo off
  3. cscript -nologo -e:jscript "%~0" <a.txt >b.txt
  4. pause & exit /b
  5. */
  6. WSH.Echo(
  7.    WSH.StdIn.ReadAll().replace(
  8.       /"[^"]*"/g,
  9.       function($0){
  10.          return $0.replace(/\r?\n/g,'')
  11.       }
  12.    )
  13. )
复制代码

作者: qq253040425    时间: 2015-11-18 17:41

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

回复 43# 依山居


    最后表示感谢,1L已更新,19L代码也更新了,27L的情况在数据库端控制好就完美解决啦~
作者: qq253040425    时间: 2015-11-18 17:42

回复 44# CrLf

1L情况已更新~

还有你这代码能直接在bat里面执行吗? 支持win7 和win2003吗
作者: CrLf    时间: 2015-11-18 18:05

回复 46# qq253040425


    忘了加上输出,已修改
    我猜是通用的,你自己试试就知道了
作者: 依山居    时间: 2015-11-18 18:40

你确认一下规范的文件是不是都是64列。每行63个逗号。最后一列是不是日期。
作者: qq253040425    时间: 2015-11-18 18:47

回复 48# 依山居

并不是 - - 数据库里面每张表字段的数量都不一样的,

现在能控制的就是最后一列是字符串,也就是导出来的文件正常情况下每一行肯定是以"结尾
作者: qq253040425    时间: 2015-11-18 18:55

回复 47# CrLf

...!!!!!! 好厉害。。反正我自己机器上是有效,我试了几种情况都能处理!求讲解

明天再去win2003上看看
作者: 依山居    时间: 2015-11-18 19:12

回复 50# qq253040425


    你也是会python的啊,没学过正则表达式吗
作者: qq253040425    时间: 2015-11-18 19:22

回复 51# 依山居

我能说我是昨天才知道有python吗 - -
作者: 依山居    时间: 2015-11-18 19:31

回复 52# qq253040425


    总之NB。
作者: qq253040425    时间: 2015-11-18 20:22

回复 53# 依山居

python有一种情况没处理的了,看1L~
作者: qq253040425    时间: 2015-11-18 20:23

回复 44# CrLf
  1. 1>1/* :
  2. @echo off
  3. set foldername=F:\BAT\tt
  4. for /f "delims=\" %%a in ('dir /b /a-d /o-d "%foldername%\*.del"') do (  
  5. cscript -nologo -e:jscript "%~0" <%%a >b.del
  6. rm %%a
  7. move b.del %%a
  8. )
  9. */
  10. WSH.Echo(
  11.    WSH.StdIn.ReadAll().replace(
  12.       /"[^"]*"/g,
  13.       function($0){
  14.          return $0.replace(/\r?\n/g,'')
  15.       }
  16.    )
  17. )
复制代码
处理指定文件夹下的所有del文件~    报告  216M的文件没问题,1.7G的文件报错了~
作者: 依山居    时间: 2015-11-18 20:27

回复 55# qq253040425


    你的机器可用内存是多少。需要处理的文件最大到多少G?
如果有条件当然是推荐你上64位,有大内存的电脑处理。
作者: 依山居    时间: 2015-11-18 20:47

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

我也上个正则表达式的版本。
考虑了可能有三种换行符号组合问题。
  1. """
  2. python正则处理DEL文件换行问题
  3. http://www.bathome.net/thread-38164-1-1.html
  4. 依山居 20:38 2015/11/18
  5. 参考了网上的资料,python 读取文件默认使用通用模式,不管\r\n都会被转换成\n
  6. 所以正则可以简化(\n),预计可以小幅提高处理速度
  7. """
  8. import re
  9. import time
  10. start=time.time()
  11. of="a.txt"
  12. rec=re.compile('(\"?)(\n)([^\"])')
  13. with open(of) as f:
  14.     txt=f.read()
  15.     res=re.sub(rec,r'\1\3',txt)
  16.     f.close()
  17. with open("out.txt","w+") as f:
  18.     f.write(res)
  19.     f.close()
  20. end=time.time()
  21. pt=end-start
  22. print("运行耗时:",pt)
  23. try:
  24.     input("按回车退出")
  25. except SyntaxError:
  26.     pass
复制代码

作者: qq253040425    时间: 2015-11-18 21:02

回复 56# 依山居


    我本机是64位+8G的内存  要处理的文本文件,目前来看 没有超过2G的...

    python没有出现过因为文件太大报错的事,现在是BAT+JS出现
作者: qq253040425    时间: 2015-11-18 21:08

回复 57# 依山居

源文件
"1","12","123","","
2015-10-31",
"1","12","123","","",
输出的文件
"1","12","123","",015-10-31",
"1","12","123","","",

wrong~
作者: CrLf    时间: 2015-11-18 21:10

本帖最后由 CrLf 于 2015-11-18 21:12 编辑

回复 55# qq253040425


    整个文件太大,那就逐行处理,换个思路,通过计算有几个 " 号来判断是否在引号内,JS 部分修改如下:
  1. var flag = false
  2. var arr = []
  3. ReadNextLine: while(!WSH.StdIn.AtEndOfStream){
  4.    var line = WSH.StdIn.ReadLine()
  5.    arr.push(line)
  6.    line.replace(/"/g,function(){flag=!flag})
  7.    if(flag&&!WSH.StdIn.AtEndOfStream) continue ReadNextLine
  8.    WSH.Echo(arr.join(''))
  9.    arr = []
  10. }
复制代码

作者: qq253040425    时间: 2015-11-18 21:20

回复 57# 依山居

还有种情况,一行多个换行符

源:
"1","1
2","123","","201
5-10-31",
"1","1
2","12
3","","",

输出:
"1","1","123","","201-10-31",
"1","1","12","","",
作者: qq253040425    时间: 2015-11-18 21:22

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

回复 44# CrLf

44L的代码

源:
"1","12","
123","","201
5-10-31",
"1","1
2","12
3","","",

这种情况也能处理成
"1","12","123","","2015-10-31",
"1","12","123","","",

到底怎么做到的 - -
作者: qq253040425    时间: 2015-11-18 21:26

回复 60# CrLf


     - - 这段代码我完全懵圈了...看不懂,也不知道怎么改  
作者: CrLf    时间: 2015-11-18 22:07

回复 62# qq253040425


    通过计算 " 个数,来判断是否在引号内,只包含奇数个 " 时一直读取下一行直到闭合,然后接为一行输出
作者: 依山居    时间: 2015-11-18 22:45

回复 61# qq253040425


    更新了。你拿来测试1.7G的文件看看需要多久。给我贴下时间。我也想知道处理这种极别的数据需要多久。
作者: 依山居    时间: 2015-11-18 22:46

回复 64# CrLf


    应该是逗号内吧。
作者: CrLf    时间: 2015-11-18 22:53

回复 66# 依山居


    引号对
作者: qq253040425    时间: 2015-11-18 22:55

回复 65# 依山居


    运行耗时: 140.09601283073425
作者: qq253040425    时间: 2015-11-18 23:08

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

回复 65# 依山居

效率没原来快是因为对一整个文件进行操作的原因吗? 原来貌似是逐行的?

不过已知会出现状况的情况也都测试过,好像没啥问题了 !!

我有百度python的正则,但是那俩带正则的地方还是完全看不懂 ,求讲解 ~~~
作者: 依山居    时间: 2015-11-18 23:34

回复 69# qq253040425


    ()包围的是子组,替换为对应的\1\3子组,相当于是换行被替换掉了。
正则略难懂,慢慢看吧。我也是反复调试了很久。

不同语言和工具里的正则基本相同.都是用\来转义一些特殊符号。
作者: qq253040425    时间: 2015-11-19 00:00

回复 60# CrLf


    我是小白!求完整代码~么么哒~1L有更新,要不要看看~
作者: 依山居    时间: 2015-11-19 07:29

本帖最后由 依山居 于 2015-11-19 08:58 编辑

回复 71# qq253040425


    列表解析的方法处理1.7G的文件有多快?你也贴个时间看看。
你的是固态硬盘?
作者: qq253040425    时间: 2015-11-19 09:43

回复 72# 依山居

我在68L回复过啦

运行耗时: 140
   
果然这个read()的办法吃内存cpu和硬盘咩
作者: qq253040425    时间: 2015-11-19 09:45

回复 72# 依山居


    我在监控,因为实际上一个文件夹下会有很多很多的del文件,一开始用32位的python读着读着就内存错误了,换64位的,倒是没报错了,但是我在内存并没有释放,一直在增大
作者: 依山居    时间: 2015-11-19 10:10

回复 73# qq253040425


    你改成19楼的代码是列表解析方式。

你给是57楼正则版的时间吧?

笨啊,处理大量数据当然也要考虑硬盘的读写速度,固态硬盘当然是比较快的。

程序后面加上txt=0 和newtxt=0 看看内存是不是会释放。
read() readlines()都是一次读取整个文件。
按我自己之前经验。行数多的文件,一次性读入整个文件进内存处理是比较快的。并且针对你的情况是无法直接改成逐读取行,并且整个处理逻辑都要改变。
作者: qq253040425    时间: 2015-11-19 10:54

以上

谢谢 @依然居 @CrLf @WHY  @回家路上 各位的帮忙
作者: 依山居    时间: 2015-11-19 16:08

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

参考了网上的资料,python 读取文件默认使用通用模式,不管\r\n都会被转换成\n
所以正则可以简化(\n)

57楼代码已经更新。如果楼主能反馈下测试时间的对比更好~。谢谢。
作者: 依山居    时间: 2015-11-24 18:42

回复 60# CrLf


      嘿嘿。我的这个思路总算变成代码了。

如果楼主还在处理这个问题,希望能反馈一下处理时间。

http://www.bathome.net/thread-38305-1-1.html
作者: 依山居    时间: 2015-11-24 19:05

楼上的代码是能处理四种情况




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2