Board logo

标题: [文本处理] 批处理如何实现多个txt文本截取固定值前后的内容? [打印本页]

作者: e2fsck    时间: 2021-9-7 17:59     标题: 批处理如何实现多个txt文本截取固定值前后的内容?

已知文件夹test下面有qq-001、qq-002~qq-985个txt文本文件,每个文件内有systeminfo:、hardinfo、softinfo、appinfo、userinfo等字段;
每个字段后面包含不同文字信息,现在的需求是根据这些字段截取出后面的信息,并重新创建到新的txt文本内,如new_qq-001、new_qq-002。
作者: idwma    时间: 2021-9-7 18:21

是在同一行还是在不同的行
作者: qixiaobin0715    时间: 2021-9-7 20:12

回复 1# e2fsck
  1. @echo off
  2. set var=systeminfo: hardinfo softinfo appinfo userinfo
  3. setlocal enabledelayedexpansion
  4. for %%i in (*.txt) do (
  5.     (for /f "delims=" %%a in ('findstr /r "%var%" %%i') do (
  6.         set "str=%%a"
  7.         for %%b in (%var%) do set str=!str:*%%b=!
  8.         echo,!str!
  9.     ))>new_%%i
  10. )
  11. pause
复制代码

作者: Batcher    时间: 2021-9-8 09:54

回复 1# e2fsck


    请把文本内容发出来以便更好的说明需求。如果文件太大,请把附件上传到阿里云盘或百度网盘。
作者: e2fsck    时间: 2021-9-8 15:42

本帖最后由 e2fsck 于 2021-9-8 15:46 编辑

举例:
文本名qq-001.txt
内容如下:
System Info:
      Computer Name =  qq-001
      OS       Type =  Windows 10 企业版 64-bit (10.0, Build 17763) (17763.rs5_release.180914-1434)
      System  Model =  123456789
      CPU     Model =  Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz (6 CPUs), ~2.8GHz
      RAM      Size =  8192MB RAM

DisplayCard :
      Display  Card =  NVIDIA GeForce GTX 1060 3GB
      DisplayMemory =  7039 MB

Mother Board:
      Manufacturer     = Dell

      MotherBoard Model= 36EF


Hard Info:
      Model=ST1000DM010-2EP102

      Size=1000202273280

需要提取这些文本中System Info:和Hard Info:两个字段后不同行的内容,提取保存到new_qq-001.txt新文本,仅限这2个指定字段,不包含其他字段,如提取System Info:后的内容,不包含Diskplay Card:字段
作者: e2fsck    时间: 2021-9-8 15:46

回复 4# Batcher

举例:
文本名qq-001.txt
内容如下:
System Info:
      Computer Name =  qq-001
      OS       Type =  Windows 10 企业版 64-bit (10.0, Build 17763) (17763.rs5_release.180914-1434)
      System  Model =  123456789
      CPU     Model =  Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz (6 CPUs), ~2.8GHz
      RAM      Size =  8192MB RAM

DisplayCard :
      Display  Card =  NVIDIA GeForce GTX 1060 3GB
      DisplayMemory =  7039 MB

Mother Board:
      Manufacturer     = Dell

      MotherBoard Model= 36EF


Hard Info:
      Model=ST1000DM010-2EP102

      Size=1000202273280

需要提取这些文本中System Info:和Hard Info:两个字段后不同行的内容,提取保存到new_qq-001.txt新文本,仅限这2个指定字段,不包含其他字段,如提取System Info:后的内容,不包含Diskplay Card:字段
作者: e2fsck    时间: 2021-9-8 15:47

回复 3# qixiaobin0715


这个实测不行,提取的内容不对
作者: idwma    时间: 2021-9-8 20:29

  1. @echo off
  2. set var="System Info:" "Hard Info:"
  3. for %%i in (*.txt) do (
  4.     (for /f "delims=" %%a in (%%i) do (
  5. if defined f (
  6. echo;%%a|findstr ":">nul&&set f=||echo %%a
  7. )
  8.          for %%b in (%var%) do (
  9. if "%%a"=="%%~b" set f=1
  10. )
  11.     ))>new_%%i
  12. )
  13. pause
复制代码

作者: qixiaobin0715    时间: 2021-9-8 21:19

回复 7# e2fsck
  1. @echo off
  2. set var=systeminfo: hardinfo: softinfo: appinfo: userinfo:
  3. setlocal enabledelayedexpansion
  4. for %%i in (*.txt) do (
  5.     (for /f "delims=" %%a in ('findstr /n ".*" %%i') do (
  6.         set "str=%%a"
  7.         set str=!str:*:=!
  8.         set str1=!str: =!
  9.         if "!str1:~-1!"==":" (
  10.             set n=false
  11.             for %%b in (%var%) do if /i "!str1!"=="%%b" set n=true&echo,!str!
  12.         ) else if "!n!"=="true" (
  13.             echo,!str!
  14.         )
  15.     ))>new_%%i
  16. )
  17. pause
复制代码

作者: qixiaobin0715    时间: 2021-9-8 22:05

以上代码经过单个文本测试。可忽略关键词字母大小写及排除关键词行多余空格的影响。
作者: e2fsck    时间: 2021-9-9 13:44

回复 10# qixiaobin0715

谢谢关注,我测试了一下这个应该是通过=号作为关键信息去提取。如果文本内容没有=号的怎么提取?
前面文本都有X=X这样的格式。
假设其中一段是admin info:
内容
admin user1
admin user100
user 198
作者: qixiaobin0715    时间: 2021-9-9 13:52

非也非也!!!
9楼代码第2行最后面加上admininfo:,前面用空格隔开。
作者: qixiaobin0715    时间: 2021-9-9 14:08

回复 11# e2fsck
与等号一毛钱的关系也没有,代码第2行罗列的是去除所有空格的字段名。
作者: e2fsck    时间: 2021-9-9 15:34

回复 13# qixiaobin0715


  确实可以了,牛逼,谢谢~




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