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

[文本处理] 【已解决】第三方工具:文本格式由竖排转换为横排

本帖最后由 思想之翼 于 2024-3-19 11:44 编辑

D:\KZ\001\DATA.txt 记录数值格式如下:



(空行)

欲将上述文本由竖排转换为横排,格式如下:
书(空格)生(空格)气(空格)
(空行)

下列代码通过fr与sed可以实现转换:
  1. fr -r:"[\r\n]+" -t:" " "D:\KZ\001\DATA.txt" && sed -i "s/$/\n/g" "D:\KZ\001\DATA.txt"
复制代码
【问题】还有其他第三方工具可以实现转换吗?
1

评分人数

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

回复 1# 思想之翼
  1. sed ":a;N;$!ba;s/\n/ /g" 1.txt > 2.txt
复制代码
1

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 1# 思想之翼
  1. sed ":a;$!N;s/\n/ /;ta;P;D" 1.txt > 2.txt
复制代码
1

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 1# 思想之翼
  1. gawk "ORS=\" \"" Old.txt > New.txt
复制代码
1

评分人数

测试代码之前请做好备份

TOP

回复 1# 思想之翼
  1. paste -s -d " " Old.txt > New.txt
复制代码
1

评分人数

测试代码之前请做好备份

TOP

只有1列么???
不是的话多列的情况下转换的结果是啥???

例如
书 批
生 处
气 理
(换行符)

转换后是

书(空格)生(空格)气(空格)批(空格)处(空格)理(空格)
(换行符)

还是

书(空格)生(空格)气(空格)
批(空格)处(空格)理(空格)
(换行符)

又或者是

书(空格)批(空格)生(空格)处(空格)气(空格)理(空格)
(换行符)

TOP

本帖最后由 aloha20200628 于 2024-3-20 18:34 编辑


一楼的代码完成两个功能,fr.exe是把文件中每组连续换行符(1-n)替换为空格,也就是把多行连一行,其间用空格分隔,但留下一个行尾空格;sed.exe只是给输出结果最后加一个空行。
不用第三方,直接用系统内置的脚本引擎jscript/vbs/ps均可轻松拿下本帖,试试如下包装jscript的批处理脚本...
以下代码存为test.bat,命令行两种用法》
   test.bat "输入数据文件" 可屏显输出结果
   test.bat  "输入数据文件">"输出结果文件" 可将屏显结果写入文件
  1. @set @v=1 //&(if "%~1" neq "" cscript /e:jscript "%~f0"<"%~1")&exit/b
  2. WSH.echo( WSH.stdin.readall().replace(/[\r\n]+/g,' ').slice(0,-1) );
复制代码
如果不苛求用空格作分隔符,用纯P也可拿下本帖...
6楼的问题可用1楼的代码跑几遍自己的示例即明其果。
1

评分人数

TOP

回复 7# aloha20200628


   
大佬,请教下,这贴用纯p不能拿下吗,用set /p不是很简单吗...
bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2024-3-18 22:53 编辑

回复 8# 77七

先看如下纯P代码...
  1. @echo off &(for /f "delims=" %%a in (' findstr /n ".*" "%~1" ') do (
  2. set "s=%%a"&setlocal enabledelayedexpansion &set "s=!s:*:=!"
  3. if "!s!" neq "" for /f "tokens=1 delims=:" %%n in ("%%~a") do if %%n equ 1 (set/p="!s!"<nul) else (set/p=",!s!"<nul)
  4. endlocal
  5. ))>"%~1.new"&exit/b
复制代码
如不计较源文件中空行和!等特殊字符须被保全的问题,用延迟变量一路护航,累加读入的各行子段,最后经echo一口气写出,的确用纯P很轻松...
否则的话,须在循环体内反复开关变量延迟,而!v!续命%v%在循环体内不好弄,那就告别缓存,拜托set/p在同一行随吃随吐吧,但set/p输出容不了前导空格
而改为后缀空格又会给输出行留下一个空格尾巴...这就是以上代码采用‘非空格’字符作分隔符的故事由来
...敬待用纯P能解此题者....
1

评分人数

TOP

回复 9# aloha20200628


   谢谢大佬指点!处理set /p="%%a "<nul 行尾多出的空格,我暂时没想到完美而且干净利落的方法,等我明天再想想。
bat小白,请多指教!谢谢!

TOP

回复 10# 77七

有解了...用最后一行序号管控输出方法即可,最后一行要改用echo...

TOP

回复 1# 思想之翼

用gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )的实现方式如下:
  1. gawk -v"RS=" "NF=NF" 1.txt>2.txt
复制代码
1

评分人数

TOP

回复 11# aloha20200628


   谢谢大佬指点!我来写一下
  1. @echo off
  2. set file=1.txt
  3. for /f "useback delims=" %%a in ("%file%") do (
  4. set /a n+=1
  5. )
  6. (for /f "useback delims=" %%a in ("%file%") do (
  7. set /a n-=1
  8. setlocal enabledelayedexpansion
  9. if !n! equ 0 (
  10. endlocal
  11. echo %%a
  12. ) else (
  13. endlocal
  14. set /p="%%a "<nul
  15. )
  16. ))>2.txt
  17. pause
复制代码



只有效率上有一点点欠缺...
1

评分人数

bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2024-3-21 21:19 编辑


用8万行数据文件测试获取文件总行数,结果是find方法比纯P循环遍历方法至少快了20倍
如果输出文件末尾无须空行,可将第4行代码中的&echo,删除
保全源文件中空行虽对本帖题型无实际意义,但对其他应用场合可能是必须...作为通用范式还是给一个力求全速的纯P版本如下
  1. @echo off &for /f %%n in ('find /c /v ""^<"%~1" ') do set/a "n=%%n"
  2. (for /f "delims=" %%a in (' findstr /n ".*" "%~1" ') do (
  3. set "s=%%a"&set/a "n-=1"&setlocal enabledelayedexpansion &set "s=!s:*:=!"
  4. if "!s!" neq "" (if !n! equ 0 (set/p="!s!"<nul&echo,) else (set/p="!s! "<nul))
  5. endlocal
  6. ))>"%~1.new"&exit/b
复制代码
如果源文件中间无空行,可用13楼的代码打底再给一个力求全速的纯P版本如下
  1. @echo off &for /f %%n in ('find /c /v ""^<"%~1" ') do set/a "n=%%n"
  2. (for /f "usebackq delims=" %%a in ("%~1") do (
  3. set "s=%%a"&set/a "n-=1"&setlocal enabledelayedexpansion
  4. if !n! equ 0 (set/p="!s!"<nul&echo,) else (set/p="!s! "<nul)
  5. endlocal
  6. ))>"%~1.new"&exit/b
复制代码
...感谢与13楼切磋
2

评分人数

TOP

回复 14# aloha20200628


   谢谢大佬指点!数万行文本使用 set /a计算总行数,确实比较影响效率,我疏忽了!
bat小白,请多指教!谢谢!

TOP

返回列表