Board logo

标题: [文本处理] 求助批处理提取包含多个关键字的整行数据,按不同关键字生成新文件的不同列 [打印本页]

作者: hnzwei    时间: 2020-11-15 08:23     标题: 求助批处理提取包含多个关键字的整行数据,按不同关键字生成新文件的不同列

求助,多个文件,每个文件中都有几行包含日期、问题、方法的关键字数据行,但各个文件中包含关键字的行位置以及关键字在该行中的位置可能不固定。原文件如下:
文件1中:
日期:20201115
问题:1   
方法:2

文件2中:
日期:20201120
问题:3
方法:4

文件3中:
日期:20201121
问题:5
方法:6
。。。。。。。。
想批量提取这些文件中的包含日期、问题、方法的整行数据合并生成新的文件,如果能生成EXCEL文件最好,内容如下 :
日期:20201115     问题:1      方法:2
日期:20201120     问题:3      方法:4
日期:20201121     问题:5      方法:6
作者: ivor    时间: 2020-11-15 19:30

本帖最后由 ivor 于 2020-11-15 19:45 编辑
  1. #&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit
  2. (dir *.txt |  %{
  3. $txt = [Io.File]::ReadAllText("$_",[Text.Encoding]::UTF8)
  4. $date = [Regex]::Match($txt, "日期:\d+")
  5. $question = [Regex]::Match($txt, "问题:\d+")
  6. $method = [Regex]::Match($txt, "方法:\d+")
  7. ($date.Value,$question.Value,$method.Value) -join "`t"
  8. } )| tee new.csv
复制代码

作者: hnzwei    时间: 2020-11-15 20:45

ivor 发表于 2020-11-15 19:30


执行时,提示"powershell 不是内部或外部命令.....",无法运行
作者: hnzwei    时间: 2020-11-15 20:58

ivor 发表于 2020-11-15 19:30

加上Powershell路径后,提示”拒绝访问“
作者: Batcher    时间: 2020-11-15 20:59

回复 1# hnzwei
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%a in ('dir /b /a-d *.txt') do (
  4.     set "str="
  5.     for /f "delims=" %%b in ('type "%%a"') do (
  6.         set "line=%%b"
  7.         if "!line:日期:=!" neq "!line!" (
  8.             set "str=!str!,%%b"
  9.         ) else if "!line:问题:=!" neq "!line!" (
  10.             set "str=!str!,%%b"
  11.         ) else if "!line:方法:=!" neq "!line!" (
  12.             set "str=!str!,%%b"
  13.         )
  14.     )
  15.     echo,!str:~1!
  16. ))>"1.csv"
复制代码
请参考Q-04把bat文件保存为ANSI编码:
https://mp.weixin.qq.com/s/6lbb97qUOs1sTyKJfN0ZEQ
作者: hnzwei    时间: 2020-11-15 21:33

回复  hnzwei 请参考Q-04把bat文件保存为ANSI编码:
Batcher 发表于 2020-11-15 20:59


OK了,不是一般的感谢,谢谢!牛哥!!!!
作者: qixiaobin0715    时间: 2020-11-15 22:23

回复 5# Batcher

第8行 set "str=!str!,%%b" 中!str!,是否是多余的,直接set "str=%%b"
第15行改为echo,!str!就行了。
作者: Batcher    时间: 2020-11-16 10:05

回复 7# qixiaobin0715


    如果你测试成功了,请把完整代码发出来看看吧。
作者: qixiaobin0715    时间: 2020-11-16 10:20

看样子不能想当然,抱歉!
作者: hnzwei    时间: 2021-2-3 12:25

回复 5# Batcher 你好!非常感谢之前你帮我写的按不同关键字生成新文件的不同列的批处理,还想再麻烦指导一下,如何把当前文件名也写到新文件的列中,新文件某一行的内容:旧文件名    旧文件A关键行     旧文件B关键行     旧文件C关键行 。。。。
作者: Batcher    时间: 2021-2-3 12:35

回复 10# hnzwei


你把5楼代码第15行改成这样试试:
echo %%a !str:~1!
作者: hnzwei    时间: 2021-2-3 12:44

回复 11# Batcher 能提取出来文件名,但跟第一个关键行的内容合并到一起了,合并成一列了  比如:001.txt日期:2021-02-03了   想要的是001.txt    日期    问题     ...
作者: hnzwei    时间: 2021-2-3 12:51

回复 11# Batcher 可以了,非常感谢!!!我改成这样:echo %%a, !str:~1!就可以了,加了个,号就可以分列了




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