找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 209233|回复: 78

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

[复制链接]
发表于 2015-11-16 18:06:24 | 显示全部楼层 |阅读模式
比如有一个文件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在读取大文件的时候会报错内存错误

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2015-11-16 20:26:30 | 显示全部楼层
  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
复制代码
发表于 2015-11-16 20:27:37 | 显示全部楼层
  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:16 | 显示全部楼层
  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
 楼主| 发表于 2015-11-16 23:15:55 | 显示全部楼层
回复 2# 回家路上

a.txt的内容并没有变
 楼主| 发表于 2015-11-16 23:17:12 | 显示全部楼层
回复 3# WHY


第一段代码执行后a.txt并没有变
第二段。。没看懂~
 楼主| 发表于 2015-11-16 23:19:29 | 显示全部楼层
回复 4# 依山居


    思路是对的,然而  'fr' 不是内部或外部命令,也不是可运行的程序或批处理文件。
发表于 2015-11-17 13:20:50 | 显示全部楼层
本帖最后由 依山居 于 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()
复制代码
 楼主| 发表于 2015-11-17 16:18:43 | 显示全部楼层
回复 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:28 | 显示全部楼层
太烦了。
有空行?
 楼主| 发表于 2015-11-17 16:53:42 | 显示全部楼层
回复 10# 依山居


还真有 = = 。。莫名奇妙最后多了一行。。。
 楼主| 发表于 2015-11-17 16:58:00 | 显示全部楼层
回复 10# 依山居


   最后一行的空行。。这个貌似没办法避免。。导出的文本数据文件都有这样的问题。。。可以在脚本里规避掉最后一行空行的问题吗
发表于 2015-11-17 17:03:42 | 显示全部楼层
楼主不考虑以 , 结尾的错误断行吗?
发表于 2015-11-17 17:08:45 | 显示全部楼层
回复 13# CrLf


    他给的例子也是真实文件,鬼知道他实际数据是怎么样的。
发表于 2015-11-17 17:10:16 | 显示全部楼层
回复 12# qq253040425


    代码更新了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 22:13 , Processed in 0.022847 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表