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

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

[复制链接]
发表于 2015-11-18 13:21:16 | 显示全部楼层
回复 29# qq253040425


    你需要把各种情况整理到汇总到帖子里。
发表于 2015-11-18 13:22:05 | 显示全部楼层
  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
复制代码
 楼主| 发表于 2015-11-18 13:23:27 | 显示全部楼层
回复 30# 依山居


   发现一个解决一个吧
 楼主| 发表于 2015-11-18 13:26:59 | 显示全部楼层
回复 32# 依山居

现在实际情况有那种本行以,结尾第二行以"开头的正确数据
 楼主| 发表于 2015-11-18 13:27:40 | 显示全部楼层
回复 31# 依山居


嗯,这段代码能应付现在的情况后我会整理下的~
 楼主| 发表于 2015-11-18 13:29:12 | 显示全部楼层
回复  依山居

大神!!
    出现问题了。。

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



    主要是27楼这种情况,现在的代码会报错
发表于 2015-11-18 13:34:31 | 显示全部楼层
回复 36# qq253040425

也只能这样了。这代码是按你原先说明的规则写的。容错性差是意料之中的。
 楼主| 发表于 2015-11-18 13:50:14 | 显示全部楼层
回复 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]]   

这一段什么意思呢~ 看不明白
 楼主| 发表于 2015-11-18 14:04:03 | 显示全部楼层
本帖最后由 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:50 | 显示全部楼层
回复 39# qq253040425


    很难改的。你搜索列表解析
我不会用列表解析作复杂的判断。
发表于 2015-11-18 14:21:00 | 显示全部楼层
  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) ]
复制代码
 楼主| 发表于 2015-11-18 14:42:21 | 显示全部楼层
回复 41# 依山居


    不行 - -  

还有 txt[r][:]是什么意思?
发表于 2015-11-18 15:02:43 | 显示全部楼层
txt是一个列表,每个元素是一行。txt[r]表示第r行
txt[r][:]表示第r行的整个内容。
发表于 2015-11-18 15:08:01 | 显示全部楼层
本帖最后由 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. )
复制代码
 楼主| 发表于 2015-11-18 17:41:58 | 显示全部楼层
本帖最后由 qq253040425 于 2015-11-18 17:44 编辑

回复 43# 依山居


    最后表示感谢,1L已更新,19L代码也更新了,27L的情况在数据库端控制好就完美解决啦~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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