[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

比如有一个文件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

  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
复制代码
人生是一部书/只有这一页最温暖/读懂它的时候/我们在远方流泪...

TOP

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

TOP

  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
下载安装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 编辑
  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()
复制代码
下载安装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

返回列表