Board logo

标题: [文本处理] 如何批处理把每一行中的某一列批量取出 [打印本页]

作者: hackes    时间: 2021-6-22 13:10     标题: 如何批处理把每一行中的某一列批量取出

请教如何用bat批量把 a.txt 文本中的每一行其中一列取出到 b.txt ,保持顺序不变

例如以下内容,我想把每一行"复制"前面的数值批量取出,比如第一条取出518数值

06-21 17:14        雅黛小棕瓶七代特润100ml 518        复制
06-21 15:30        娇日晚霜新日 1080        复制
06-21 15:28        娇蜂姿水150ml 有小票 270        复制
06-21 15:23        植村秀55号刷子 220        复制
06-21 15:21        香儿山花洁面新 308        复制
06-21 15:19        雅黛抗蓝光眼霜15ML 218        复制
作者: newswan    时间: 2021-6-22 13:51

有的是第四列有的是第五列?
作者: qixiaobin0715    时间: 2021-6-22 14:47

列与列之间是用制表符还是固定数量的空格分隔的?
作者: yhcfsr    时间: 2021-6-22 17:11

本帖最后由 yhcfsr 于 2021-6-22 18:28 编辑

powershell 正则,何其简单
  1. @powershell -c "gc a.txt|foreach-object{$_ -replace '.*\s+(\d+)\s+复制.*','$1'}|Out-File -FilePath b.txt"
复制代码

作者: yakeyun    时间: 2021-7-18 12:57

本帖最后由 yakeyun 于 2021-7-18 16:19 编辑

可以先判断,如果所取值=有小票,就取第5列并输出,否则输出第四列。
大致思路如下,但是%%b输出不对,麻烦大佬看下是哪里出了问题。

@echo off
setlocal EnableDelayedExpansion
set "pj = 有小票"
(for /f "tokens=4,5" %%a in (a.txt) do (
if %%a == pj (
echo,%%b >> b.txt
) else (
echo,%%a >> b.txt
)
)
)
exit

用pause截获方法,终于找到原因。通过修改找到了BUG
截取结果:
我是非小票输出行
518
我是非小票输出行
1080
我是非小票输出行
有小票
我是非小票输出行
220
我是非小票输出行
308
我是非小票输出行
218

发现是没有判断,所以通过代码测试,最终代码如下:

@echo off
setlocal EnableDelayedExpansion
(for /f "tokens=4,5" %%a in ('type "a.txt"') do (
if %%a == 有小票 (
echo 我是小票输出行 >> b.txt
echo,%%b >> b.txt
) else (
echo 我是非小票输出行 >> b.txt
echo,%%a >> b.txt
)
)
)
exit

再次测试结果正常

我是非小票输出行
518
我是非小票输出行
1080
我是小票输出行
270
我是非小票输出行
220
我是非小票输出行
308
我是非小票输出行
218
作者: yakeyun    时间: 2021-7-18 16:14

回复 7# yakeyun

最终代码:

@echo off
setlocal EnableDelayedExpansion
(for /f "tokens=4,5" %%a in ('type "a.txt"') do (
if %%a == 有小票 (
echo,%%b >> b.txt
) else (
echo,%%a >> b.txt
)
)
)
exit
作者: qixiaobin0715    时间: 2021-7-18 17:16

如果像楼主提供的格式的话,可以取倒数第二列的数值:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in (a.txt) do (
  4.     set "str1=%%a"
  5.     set str1=!str1:复制=!
  6.     for %%i in (!str1!) do set str2=%%i
  7.     echo,!str2!
  8. )
  9. pause
复制代码

作者: CrLf    时间: 2021-7-24 00:00

邪恶解法
  1. @echo off
  2. (for /f "delims=" %%a in (a.txt) do (
  3.   set str=%%a
  4.   setlocal enabledelayedexpansion
  5.   for %%b in ("!str: =\!\..") do echo;%%~nb
  6.   endlocal
  7. ))>b.txt
  8. pause
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2