[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 求助BAT文本处理-有规律、删除指定段、移动段落位置

各位大佬好,我在工作中遇到了一点问题,不用慌,问题很大,慌也没用!
这边有大量的文档出现了故障,但是好在内容有规律,拜托大佬帮帮忙啦!谢谢~
【功能
1、将文档内第n段内容 删除
2、将文档内第n段内容 提前/置后n段
【内容说明
===段落定义:
1、【    - - [】开头【, 1]】结尾的行 是段落的开头行(必备)
2、【      - [】开头【, 0]】结尾的行 是段落的中间行(不全都有)
3、【      - [】开头【, 1]】结尾的行 是段落的结尾行(必备)
===文档特征:
1、每个【    skel:】之后是一节,是需要处理的文本,每节有多段,每节的段落总数相同
2、段落中[A, B, C]内的数字 必然有3个,A和B的范围是-1至500,C是0或1
【内容展示
  1. data:
  2.   '0000':
  3.     size: [500, 500]
  4.     skel:
  5.     - - [172, 127, 1]
  6.       - [296, 85, 1]
  7.     - - [115, 134, 1]
  8.       - [321, 123, 0]
  9.       - [138, 431, 1]
  10.     - - [187, 199, 1]
  11.       - [295, 166, 1]
  12.     - - [321, 135, 1]
  13.       - [321, 123, 0]
  14.       - [314, 223, 1]
  15.     - - [166, 272, 1]
  16.       - [342, 229, 1]
  17.     - - [287, 256, 1]
  18.       - [247, 317, 1]
  19.     - - [146, 351, 1]
  20.       - [404, 296, 1]
  21.   '2000':
  22.     size: [500, 500]
  23.     skel:
  24.     - - [225, 81, 1]
  25.       - [369, 47, 1]
  26.     - - [170, 78, 1]
  27.       - [173, 363, 1]
  28.     - - [210, 159, 1]
  29.       - [365, 125, 1]
  30.     - - [365, 125, 1]
  31.       - [343, 190, 1]
  32.     - - [229, 223, 1]
  33.       - [376, 210, 1]
  34.     - - [302, 228, 1]
  35.       - [273, 277, 1]
  36.     - - [193, 304, 1]
  37.       - [479, 299, 1]
  38.   '3001':
  39.     size: [500, 500]
  40.     skel:
  41.     - - [175, 99, 1]
  42.       - [348, 70, 1]
  43.     - - [146, 112, 1]
  44.       - [155, 388, 1]
  45.     - - [187, 199, 1]
  46.       - [327, 166, 1]
  47.     - - [360, 158, 1]
  48.       - [338, 226, 1]
  49.     - - [179, 264, 1]
  50.       - [370, 234, 1]
  51.     - - [286, 263, 1]
  52.       - [303, 316, 0]
  53.       - [269, 305, 1]
  54.     - - [173, 331, 1]
  55.       - [303, 316, 0]
  56.       - [425, 310, 1]
复制代码
【图例说明
操作:将文档内第3段内容 提前1段(还需要置后功能)
谢谢!!

你搞一个正确的段落排序让后面的大神看。能用图片说清的就少用文字。

TOP

本帖最后由 WHY 于 2019-4-25 22:55 编辑
  1. $n = 2;  #删除第2个段落
  2. $str = [IO.File]::ReadAllText('1.txt', [Text.Encoding]::Default);
  3. $arr = $str -split '(?<=skel:)';
  4. $Len = $arr.Count;
  5. for($i=0; $i -lt $Len; $i++) {
  6.     $m = $arr[$i] -split '(?<=- - \[-?\d+, -?\d+, 1](?:(?!- - \[)[\s\S])*- \[-?\d+, -?\d+, 1])';
  7.     if($m.Count -gt $n) {
  8.         $m[$n-1] = '';
  9.         $arr[$i] = $m -join '';
  10.     }
  11. }
  12. [IO.File]::WriteAllText('2.txt', $arr -join '', [Text.Encoding]::Default);
复制代码
  1. $n, $k = 4, 2;   #第4个段落下移2段
  2. $str = [IO.File]::ReadAllText('1.txt', [Text.Encoding]::Default);
  3. $arr = $str -split '(?<=skel:)';
  4. $Len = $arr.Count;
  5. for($i=0; $i -lt $Len; $i++) {
  6.     $m = $arr[$i] -split '(?<=- - \[-?\d+, -?\d+, 1](?:(?!- - \[)[\s\S])*- \[-?\d+, -?\d+, 1])';
  7.     if($m.Count -gt ($n+$k)) {
  8.         $m[$n+$k-1] += $m[$n-1];
  9.         $m[$n-1] = '';
  10.         $arr[$i] = $m -join '';
  11.     }
  12. }
  13. [IO.File]::WriteAllText('2.txt', $arr -join '', [Text.Encoding]::Default);
复制代码
  1. $n, $k = 4, 2;   #第4个段落上移2段
  2. $str = [IO.File]::ReadAllText('1.txt', [Text.Encoding]::Default);
  3. $arr = $str -split '(?<=skel:)';
  4. $Len = $arr.Count;
  5. for($i=0; $i -lt $Len; $i++) {
  6.     $m = $arr[$i] -split '(?<=- - \[-?\d+, -?\d+, 1](?:(?!- - \[)[\s\S])*- \[-?\d+, -?\d+, 1])';
  7.     if($m.Count -gt $n -and $n -gt $k) {
  8.         $m[$n-$k-1] = $m[$n-1] + $m[$n-$k-1];
  9.         $m[$n-1] = '';
  10.         $arr[$i] = $m -join '';
  11.     }
  12. }
  13. [IO.File]::WriteAllText('2.txt', $arr -join '', [Text.Encoding]::Default);
复制代码

TOP

每个skel:内的段是单独编号呢,还是所有skel:的段是统一连续编号?
QQ 33892006

TOP

本帖最后由 40252492 于 2019-4-24 17:38 编辑

回复 4# yhcfsr


    十分感谢您的指导,已修改
【每个skel:内的段是单独编号
比如总段落数是7,每个skel:内都是1-7段

TOP

回复 5# 40252492
保存为bat文件,放在处理文件目录中.
测试前务必备份文件
  1. @Powershell "& {[ScriptBlock]::Create("'#' + ([io.file]::ReadAllText('%~f0',[text.encoding]::Default))").Invoke()}" & pause & exit
  2. <#
  3.     sid:每节的段编号
  4.     offset:置后N段设置N,前置N段设置为-N,0为删除sid指定的段
  5. #>
  6. $sid=3;#段落编号
  7. $offset=2;#偏移距离,正数为后移,负数为前移,0为删除
  8. #===================================
  9. $files=dir *.txt -Recurse;
  10. foreach($txt_file in $files)
  11. {
  12.     $text = type $txt_file -ReadCount 0;
  13.     [System.Collections.ArrayList] $result=@();
  14.     [System.Collections.ArrayList] $data=@();
  15.     [System.Collections.ArrayList] $passage=@();
  16.     $count=$text.Count;
  17.     $counter=0;
  18.     while($counter -le $count)
  19.     {
  20.         $line=$text[$counter++];
  21.         if($line -notmatch '-')
  22.         {
  23.             if($passage)
  24.             {
  25.                 [void]$data.Add($passage);
  26.                 $passage=@();
  27.             }
  28.             if($data)
  29.             {
  30.                 $val=$data[$sid-1];
  31.                 switch($offset)
  32.                 {
  33.                     0 {$data.RemoveAt($sid-1);break;}
  34.                     default {$data.RemoveAt($sid-1);$data.Insert($sid+$offset-1,$val);}
  35.                 }
  36.                 [void] $result.Add($data);
  37.                 $data=@();
  38.             }
  39.             [void] $result.Add($line);
  40.         
  41.         }
  42.    
  43.         elseif($line -match '- -')
  44.         {
  45.             if($passage)
  46.             {
  47.                 [void]$data.Add($passage);
  48.                 $passage=@();
  49.             }
  50.         
  51.             [void] $passage.Add($line);
  52.         
  53.             continue;
  54.         }
  55.         else
  56.         {
  57.             [void] $passage.Add($line);
  58.         
  59.             continue;
  60.         }   
  61.     }
  62.     [System.Collections.ArrayList] $output=@();
  63.     foreach($item in $result)
  64.     {
  65.         
  66.         foreach($idata in $item)
  67.         {
  68.             foreach($ipassage in $idata)
  69.             {
  70.                 [void] $output.Add($ipassage)
  71.             }
  72.         }
  73.         
  74.     }
  75.     [io.file]::WriteAllLines($txt_file,$output,[text.encoding]::Default);
  76. }
复制代码
QQ 33892006

TOP

回复 6# yhcfsr


    谢主隆恩!!!

TOP

回复 7# 40252492

不用客气.解决了的话,就结贴评分,有能力的赞助下论坛
QQ 33892006

TOP

返回列表