返回列表 发帖

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

比如有一个文件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在读取大文件的时候会报错内存错误
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
set line=%%i
set line=!line:"=#!
if "!line:~-1!" neq "#" (
set pre=%%i
) else echo;!pre!%%i&set pre=
)
pause & exit /bCOPY
人生是一部书/只有这一页最温暖/读懂它的时候/我们在远方流泪...

TOP

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

TOP

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

试了半天。思路是结尾不是“符号就把回车换行替换成空。
http://baiy.cn/utils/fr/index.htm
下载安装python3 https://www.python.org/downloads/ 代码存为xx.py 双击运行或IDLE打开F5运行

TOP

回复 2# 回家路上

a.txt的内容并没有变

TOP

回复 3# WHY


第一段代码执行后a.txt并没有变
第二段。。没看懂~

TOP

回复 4# 依山居


    思路是对的,然而  'fr' 不是内部或外部命令,也不是可运行的程序或批处理文件。

TOP

本帖最后由 依山居 于 2015-11-17 17:07 编辑
"""
python把不以引号结尾的行与下一行连接
题目来源 http://www.bathome.net/thread-38164-1-1.html
依山居  13:13 2015/11/17
就是当是练习列表解析用法了
"""
newtxt=[]
with open("a.txt") as f:
    txt=f.readlines()
    txt=[r.rstrip() for r in txt]
    rn=len(txt)
    print("总行数:",rn)
    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]]
    f.close()
   
with open("b.txt","w+") as f:
    f.writelines(newtxt)
    f.close()COPY
下载安装python3 https://www.python.org/downloads/ 代码存为xx.py 双击运行或IDLE打开F5运行

TOP

回复 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
>>>

TOP

太烦了。
有空行?
下载安装python3 https://www.python.org/downloads/ 代码存为xx.py 双击运行或IDLE打开F5运行

TOP

回复 10# 依山居


还真有 = = 。。莫名奇妙最后多了一行。。。

TOP

回复 10# 依山居


   最后一行的空行。。这个貌似没办法避免。。导出的文本数据文件都有这样的问题。。。可以在脚本里规避掉最后一行空行的问题吗

TOP

楼主不考虑以 , 结尾的错误断行吗?

TOP

回复 13# CrLf


    他给的例子也是真实文件,鬼知道他实际数据是怎么样的。
下载安装python3 https://www.python.org/downloads/ 代码存为xx.py 双击运行或IDLE打开F5运行

TOP

回复 12# qq253040425


    代码更新了。
下载安装python3 https://www.python.org/downloads/ 代码存为xx.py 双击运行或IDLE打开F5运行

TOP

返回列表