Board logo

标题: [文本处理] BAT批处理如何实现1、合并符合条件的txt 2、编辑txt文件的内容? [打印本页]

作者: bat好强大    时间: 2014-1-17 11:10     标题: BAT批处理如何实现1、合并符合条件的txt 2、编辑txt文件的内容?

本帖最后由 bat好强大 于 2014-1-17 21:44 编辑

目前有一系列操作,由于工作量大,想通过BAT来实现。我现在是这么做的:

-----------第一步 合并txt 分割线-----------

在文件夹 F1根下,有(E1.exe,E2.exe,T1.txt,T2.txt,T3.txt ... T10.txt)等文件,

我需要 合并 T1.txt T2.txt,T5-T10.txt  把*.exe 和 T3.txt T4.txt 排除掉,

于是 先
  1. dir /b | findstr /v /x "T3.txt T4.txt" | findstr ".txt" > temp.txt
复制代码
再按照 temp.txt 里的结果,编辑一行命令进行合并
  1. cppy 1.txt+2.txt+5.txt+...+10.txt temp.txt
复制代码
纯手工编辑,很原始的办法

-----------第二步 文本编辑 分割线-----------

得到的temp.txt文件内容 为 T1L1、T1L2、... T1Ln ,  T2L1,...T2Ln 这样的一列n行,

正常的行内容为 ABBBBBB ,有少数异常行为  ABBBBBBABBBBBB ,有少数重复内容行,一些空白行,

我需要 截断异常行,去除空白行和重复行,并把结果整理为 BBBBBB.A,BBBBBB.A,BBBBBB.A, 这样的形式,

目前是通过对 temp.txt内容用excel分列后处理来做的, 土的不行,很没效率


请问如何用批处理实现? 谢谢!


作者: DAIC    时间: 2014-1-17 11:18

第一步
  1. @echo off
  2. (for %%i in (T*.txt) do (
  3.     type "%%i"
  4.     echo,
  5. ))>temp.log
复制代码

作者: DAIC    时间: 2014-1-17 11:22

第二步:
请把2楼代码生成的temp.log内容发一段出来(包括正常的行和异常的行)
然后说清楚希望得到的结果是什么
请用真实数据,原始格式。
如果要瞎编数据,请保证格式和真实数据完全一致。
作者: bat好强大    时间: 2014-1-17 11:22

回复 2# DAIC


    感谢回复,需要建立一个 “T*.txt” 文件,把需要合并的文件名存进去么 ?
作者: bat好强大    时间: 2014-1-17 11:36

回复 2# DAIC


    运行结果是
%%i was unexpected at this time.
  可能是我的操作问题?
作者: bat好强大    时间: 2014-1-17 11:48

回复 2# DAIC

运行成功了,我指定T1.txt T2.txt 的内容放入 temp.log
  1. @echo off
  2. (for %%i in (T1.txt,T2.txt) do (
  3.     type "%%i"
  4.     echo,
  5. ))>temp.log
复制代码
内容如附件:
作者: terse    时间: 2014-1-17 12:17

先看结果
  1. @ECHO OFF
  2. for /f "delims=" %%i in ('DIR /b T*.txt^|findstr /ivx "T[3-4].txt"') do (
  3.     for /f "usebackq delims=" %%j in ("%%i") do (
  4.         if not defined %%j echo %%j
  5.         set "%%j=1"
  6.     )
  7. )
  8. PAUSE
复制代码

作者: DAIC    时间: 2014-1-17 12:44

回复 6# bat好强大


T*.blk这个用通配符可以自动处理所有以字母T开头的.blk文件
不用一个一个的指定
  1. @echo off
  2. (for %%i in (T*.blk) do (
  3.     type "%%i"
  4.     echo,
  5. ))>temp.log
复制代码

作者: DAIC    时间: 2014-1-17 12:47

回复 6# bat好强大


如果要排除某两个文件,除了7楼的做法之外也可以这样:
  1. @echo off
  2. (for %%i in (T*.blk) do (
  3.     if "%%i" neq "T3.blk" (
  4.         if "%%i" neq "T4.blk" (
  5.             type "%%i"
  6.             echo,
  7.         )
  8.     )
  9. ))>temp.log
复制代码

作者: DAIC    时间: 2014-1-17 12:57

回复 6# bat好强大


第二步:对temp.log的进一步处理
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=*" %%i in (temp.log) do (
  4.     set str=%%i
  5.     if "!str:~7!" neq "" (
  6.         set strA=!str:~0,7!
  7.         set strB=!str:~7!
  8.         if not defined !strA! (
  9.             echo,!strA!
  10.             set strA=1
  11.         )
  12.         if not defined !strB! (
  13.             echo,!strB!
  14.             set strB=1
  15.         )
  16.     ) else (
  17.         if not defined %%i (
  18.             echo,%%i
  19.             set %%i=1
  20.         )
  21.     )
  22. ))>temp_2.log
复制代码

作者: bat好强大    时间: 2014-1-17 21:51

回复 9# DAIC


    给每个要排除的文件做一层嵌套么,我试试
作者: bat好强大    时间: 2014-1-17 22:07

先看结果
terse 发表于 2014-1-17 12:17


感谢回复。 运行结果把T3、T4.txt以外的*.txt内容都显示出来了。 请问1、把屏显结果输出到文本如何改写,2、如果要排除的多个文件,文件名不规则,怎么办呢?
作者: bat好强大    时间: 2014-1-17 22:30

回复  bat好强大


第二步:对temp.log的进一步处理
DAIC 发表于 2014-1-17 12:57



    厉害!DAIC 真是高手! 运行结果基本满足我的要求,只需稍微再加工下就可以用了,比手工做方便很多啊。

   代码看不太懂,我慢慢消化。。
作者: terse    时间: 2014-1-18 00:04

回复 12# bat好强大

对于楼主的表述有些是靠猜测的
这里难道不是把 除T3、T4.txt以外的TXT文件都显示吗?
输出到文本的话 就重定向输出吧
要排除的文件大概多少  几十个 还是上千呢? 太多的话可以先写入文本 然后排除
另对于输出内容的错误格式 没明确的指出 重复行可以理解
对于一楼样本期望输出是每行7个字符吗;这里原文件每行字符范围多少?小于或大于7个字符怎么处理
输出到temp.log
  1. @ECHO OFF
  2. (for /f "delims=" %%i in ('DIR /b T*.txt^|findstr /ivx "T[3-4].txt"') do (
  3.     for /f "usebackq delims=" %%j in ("%%i") do (
  4.         if not defined %%j echo %%j
  5.         set "%%j=1"
  6.     )
  7. ))>temp.log
复制代码

作者: bat好强大    时间: 2014-1-20 10:03

本帖最后由 bat好强大 于 2014-1-20 10:05 编辑

回复 14# terse

   
这里难道不是把 除T3、T4.txt以外的TXT文件都显示吗?
是的是的,你的代码非常正确的实现了这个意图!
   
   
要排除的文件大概多少  几十个 还是上千呢? 太多的话可以先写入文本 然后排除
目前要排除的文件有近20个,并且这个清单会经常变动,请问如何实现 写入文本然后排除呢 ?   
   
   
另对于输出内容的错误格式 没明确的指出 重复行可以理解
对于一楼样本期望输出是每行7个字符吗;这里原文件每行字符范围多少?小于或大于7个字符怎么处理

1、原文件是1列n行,每行7个字符。2、输出期望是7个字符一行。3、可能是两个txt之间的衔接问题,造成合并后文本出现一行14个字符的情况。4、希望把14个字符的行截断为两行。5、在合并后的文档里,可能有内容完全相同的两行或多行,需要只保留其中一行。

    非常感谢你的回复! 抱歉问题没有说清楚, 我在 6楼 放了一个.txt 合并后的文件片断,请你看一下!
作者: terse    时间: 2014-1-20 14:08

回复 15# bat好强大
  1. @ECHO OFF
  2. :: 要排除的文件名没规律 所以在下面列出部分排除文件
  3. :: 可自行修改 也可自己预先写入文件
  4. ::t3.txt
  5. ::t4.txt
  6. ::t8.txt
  7. ::t6.txt
  8. (for /f "delims=:" %%i in ('findstr /ix ":.*\.txt" "%~0"') do echo %%i)>#
  9. (for /f "delims=" %%i in ('DIR /b T*.txt^|findstr /ivxg:"#"') do (
  10.     for /f "usebackq delims=" %%j in ("%%i") do (
  11.         if not defined %%j echo %%j
  12.         set "%%j=1"
  13.     )
  14. ))>temp.log
  15. del #
  16. pause
复制代码
这里生成的 temp.log 是否预想中的?
作者: bat好强大    时间: 2014-1-20 15:07

回复 16# terse


   
这里生成的 temp.log 是否预想中的?
犀利! 和我想要的完全一样啊, 你太强大了!

    生成的.log里,每行字符排列的很规整,看起来赏心悦目 赞!

    在看到这段代码的运行结果以前,我不会相信注释内容,能作为参数的
作者: shunshunshun    时间: 2015-8-30 15:16

简单  

1,要么移动move T3 T4txt
2,要么删除T3 T4txt
3,copy d:\xx\*.txt d:\xx\合并所有的TXT.txt
作者: shunshunshun    时间: 2015-8-30 15:18

如果 不想合并的过多。那先把所有的TXT名,弄到EXCEL里。然后再编辑排序




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