返回列表 发帖

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

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

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



(空行)

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

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

评分人数

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

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

评分人数

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

TOP

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

评分人数

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

TOP

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

评分人数

测试代码之前请做好备份

TOP

回复 1# 思想之翼
paste -s -d " " Old.txt > New.txtCOPY
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  "输入数据文件">"输出结果文件" 可将屏显结果写入文件
@set @v=1 //&(if "%~1" neq "" cscript /e:jscript "%~f0"<"%~1")&exit/b
WSH.echo( WSH.stdin.readall().replace(/[\r\n]+/g,' ').slice(0,-1) );COPY
如果不苛求用空格作分隔符,用纯P也可拿下本帖...
6楼的问题可用1楼的代码跑几遍自己的示例即明其果。
1

评分人数

TOP

回复 7# aloha20200628


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

TOP

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

回复 8# 77七

先看如下纯P代码...
@echo off &(for /f "delims=" %%a in (' findstr /n ".*" "%~1" ') do (
set "s=%%a"&setlocal enabledelayedexpansion &set "s=!s:*:=!"
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)
endlocal
))>"%~1.new"&exit/bCOPY
如不计较源文件中空行和!等特殊字符须被保全的问题,用延迟变量一路护航,累加读入的各行子段,最后经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 )的实现方式如下:
gawk -v"RS=" "NF=NF" 1.txt>2.txtCOPY
1

评分人数

TOP

回复 11# aloha20200628


   谢谢大佬指点!我来写一下
@echo off
set file=1.txt
for /f "useback delims=" %%a in ("%file%") do (
set /a n+=1
)
(for /f "useback delims=" %%a in ("%file%") do (
set /a n-=1
setlocal enabledelayedexpansion
if !n! equ 0 (
endlocal
echo %%a
) else (
endlocal
set /p="%%a "<nul
)
))>2.txt
pauseCOPY



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

评分人数

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

TOP

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


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

评分人数

TOP

回复 14# aloha20200628


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

TOP

返回列表