Board logo

标题: 已解决-(50块钱)删除每行前/后8个汉字内所包含的标点符号 [打印本页]

作者: 黄大人    时间: 2021-2-11 22:36     标题: 已解决-(50块钱)删除每行前/后8个汉字内所包含的标点符号

本帖最后由 黄大人 于 2021-2-12 10:32 编辑

具体报酬:50元
支付方式:微信/支付宝
联系方式:已解决
有效期限:已解决
系统:win7  64位

删除每行前面8个汉字内所包含的标点符号,或且删除每行后面8个汉字内所包含的标点符号

两个功能要求,可分开写也可写单独写,单独写你要教我,前后功能要改哪里。

第一功能:(把每行前8个汉字所包含的标点删除,不管中英标点)
处理前:
当别人,说你,不好不适合我时、我只说了,一句话我喜欢。
如果、我的时。空没有了你那么。我将石沉,海底。

处理后:
当别人说你不好不适合我时、我只说了,一句话我喜欢。
如果我的时空没有了你那么。我将石沉,海底。


第二功能:(把每行后8个汉字所包含的标点删除,不管中英标点)
处理前:
当别人,说你,不好不适合我时、我只说了,一句话,我喜欢。
如果、我的时。空没有了你那么。我将。石沉,海底。

处理后:
当别人,说你,不好不适合我时、我只说了一句话我喜欢
如果、我的时。空没有了你那么我将石沉海底

注:要有备份功能,处理后的文件自动保存到另一文件夹。
作者: flashercs    时间: 2021-2-11 23:43

本帖最后由 flashercs 于 2021-2-12 01:22 编辑

保存为.bat
  1. <#*,:&cls
  2. @echo off
  3. pushd "%~dp0"
  4. powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~0\" -ReadCount 0 | Out-String ))) "
  5. popd
  6. pause
  7. exit /b
  8. #>
  9. # 如果替换,则值为1;如果不替换,则值为0
  10. $替换前8 = 1
  11. $替换后8 = 1
  12. # 输出目录
  13. $dirOut = ".\newDir"
  14. # 前后汉字数量,默认是8
  15. $CJKCount = 8
  16. if (-not (Test-Path -Path $dirOut)) {
  17.   New-Item -Path $dirOut -ItemType Directory
  18. } elseif (-not (Test-Path -Path $dirOut -PathType Container)) {
  19.   Remove-Item -Path $dirOut -Force
  20.   New-Item -Path $dirOut -ItemType Directory
  21. }
  22. function Get-Encoding {
  23.   # output: [System.Text.Encoding], $null
  24.   [CmdletBinding(DefaultParameterSetName = "PathSet")]
  25.   param (
  26.     [Parameter(ParameterSetName = "StreamSet", Mandatory = $true)]
  27.     [ValidateNotNullOrEmpty()]
  28.     [System.IO.Stream]$Stream,
  29.     [Parameter(ParameterSetName = "PathSet", Mandatory = $true, Position = 0)]
  30.     [ValidateNotNullOrEmpty()]
  31.     [System.String]$Path,
  32.     [Parameter(Mandatory = $false, Position = 1)]
  33.     [System.UInt32]$ReadCount = 1024
  34.   )
  35.   $utf8BOMThrow = New-Object System.Text.UTF8Encoding -ArgumentList @($true, $true)
  36.   $utf8NoBOMThrow = New-Object System.Text.UTF8Encoding -ArgumentList @($false, $true)
  37.   $utf16LEBOMThrow = New-Object System.Text.UnicodeEncoding -ArgumentList @($false, $true, $true)
  38.   $utf16LENoBOMThrow = New-Object System.Text.UnicodeEncoding -ArgumentList @($false, $false, $true)
  39.   $utf16BEBOMThrow = New-Object System.Text.UnicodeEncoding -ArgumentList @($true, $true, $true)
  40.   $utf16BENoBOMThrow = New-Object System.Text.UnicodeEncoding -ArgumentList @($true, $false, $true)
  41.   # type encoding,bool bom,bool throw,Text.Encoding encoding,byte[] preamble,string strPreamble
  42.   $arrUTF8Bom = $utf8BOMThrow.GetPreamble()
  43.   $arrUTF16LEBom = $utf16LEBOMThrow.GetPreamble()
  44.   $arrUTF16BEBom = $utf16BEBOMThrow.GetPreamble()
  45.   
  46.   if ($PSCmdlet.ParameterSetName -eq "PathSet") {
  47.     try {
  48.       $Stream = New-Object System.IO.FileStream -ArgumentList @($Path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::Read)
  49.     } catch {
  50.       return $null
  51.     }
  52.   }
  53.   $byteBuff = New-Object byte[] -ArgumentList 3
  54.   $readCount = $Stream.Read($byteBuff, 0, 3)
  55.   if ($byteBuff[0] -eq $arrUTF8Bom[0] -and $byteBuff[1] -eq $arrUTF8Bom[1] -and $byteBuff[2] -eq $arrUTF8Bom[2]) {
  56.     # utf8bom
  57.     $return = $utf8BOMThrow
  58.   } elseif ($byteBuff[0] -eq $arrUTF16LEBom[0] -and $byteBuff[1] -eq $arrUTF16LEBom[1]) {
  59.     # utf16lebom
  60.     $return = $utf16LEBOMThrow
  61.   } elseif ($byteBuff[0] -eq $arrUTF16BEBom[0] -and $byteBuff[1] -eq $arrUTF16BEBom[1]) {
  62.     # utf16bebom
  63.     $return = $utf16BEBOMThrow
  64.   } else {
  65.     # nobom
  66.     if ($ReadCount -gt 0) {
  67.       $charBuff = New-Object char[] -ArgumentList $ReadCount
  68.     }
  69.     # utf16-nobom 都被认为是ANSI编码
  70.     foreach ($encoding in @($utf8NoBOMThrow<# , $utf16LENoBOMThrow, $utf16BENoBOMThrow #>)) {
  71.       try {
  72.         $Stream.Position = 0
  73.         $sr = New-Object System.IO.StreamReader -ArgumentList @($Stream, $encoding, $false)
  74.         if ($ReadCount -gt 0) {
  75.           [void]$sr.Read($charBuff, 0, $ReadCount)
  76.         } else {
  77.           [void]$sr.ReadToEnd()
  78.         }
  79.         $return = $encoding
  80.         break
  81.       } catch {
  82.         
  83.       } finally {
  84.         if ($sr) {
  85.           $sr.Dispose()
  86.         }
  87.       }
  88.     }
  89.   }
  90.   if ($PSCmdlet.ParameterSetName -eq "PathSet") {
  91.     $Stream.Dispose()
  92.   }
  93.   if (!$return) {
  94.     $return = [System.Text.Encoding]::Default
  95.   }
  96.   return $return  
  97. }
  98. $reCJK = New-Object System.Text.RegularExpressions.Regex -ArgumentList @('\p{IsCJKUnifiedIdeographs}', 'Compiled, Ignorecase')
  99. # $reCJK = New-Object System.Text.RegularExpressions.Regex -ArgumentList @('\w', 'Compiled, Ignorecase')
  100. Get-ChildItem -Path .\*.txt -Filter *.txt -Include *.txt | ForEach-Object {
  101.   if (-not $_.PSIsContainer) {
  102.     $encoding = Get-Encoding -Path $_.FullName
  103.     if ($null -eq $encoding) {
  104.       $encoding = [System.Text.Encoding]::GetEncoding(0)
  105.     }
  106.     try {
  107.       [System.IO.File]::WriteAllLines((Join-Path -Path $dirOut -ChildPath $_.Name), [string[]]@([System.IO.File]::ReadAllLines($_.FullName, $encoding) | ForEach-Object {
  108.             $str = $_
  109.             if ($替换前8) {
  110.               $cjkMatches = $reCJK.Matches($str)
  111.               if ($cjkMatches.Count -gt 0) {
  112.                 $index = $cjkMatches[[math]::Min($CJKCount - 1, $cjkMatches.Count - 1)].Index
  113.                 $str = ($str.Substring(0, $index + 1) -replace '[\p{P}]+', '') + $str.Substring($index + 1)
  114.               }
  115.             }
  116.             if ($替换后8) {
  117.               $cjkMatches = $reCJK.Matches($str)
  118.               if ($cjkMatches.Count -gt 0) {
  119.                 $index = $cjkMatches[[math]::Max(0, $cjkMatches.Count - $CJKCount)].Index
  120.                 $str = $str.Substring(0, $index) + ($str.Substring($index) -replace '[\p{P}]+', '')
  121.               }
  122.             }
  123.             $str
  124.           }), $encoding)
  125.     } catch {
  126.       $_ | Write-Host -ForegroundColor Red
  127.     }
  128.   }
  129. }
复制代码

作者: 黄大人    时间: 2021-2-12 10:30

回复 2# flashercs


    代码验证OK,已打款到支付宝,请查收。
作者: 黄大人    时间: 2021-2-12 15:44

回复 2# flashercs


    代码比我想像中的好用,维一不足的就是运行中没有进度状态显示,运行时就一黑压压没变化的窗口,处理文件多的时候,都不知道是死了还是卡住了。
作者: flashercs    时间: 2021-2-12 17:12

回复 4# 黄大人


    修改一下,显示处理文件.
  1. <#*,:&cls
  2. @echo off
  3. pushd "%~dp0"
  4. powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~0\" -ReadCount 0 | Out-String ))) "
  5. popd
  6. pause
  7. exit /b
  8. #>
  9. # 功能:删除每行前8/后8个汉字CJK字符中的标点符号.
  10. # 如果替换,则值为1;如果不替换,则值为0
  11. $替换前8 = 1
  12. $替换后8 = 1
  13. # 输出目录
  14. $dirOut = ".\newDir"
  15. # 前后汉字数量,默认是8
  16. $CJKCount = 8
  17. if (-not (Test-Path -Path $dirOut)) {
  18.   New-Item -Path $dirOut -ItemType Directory
  19. } elseif (-not (Test-Path -Path $dirOut -PathType Container)) {
  20.   Remove-Item -Path $dirOut -Force
  21.   New-Item -Path $dirOut -ItemType Directory
  22. }
  23. function Get-Encoding {
  24.   # output: [System.Text.Encoding], $null
  25.   [CmdletBinding(DefaultParameterSetName = "PathSet")]
  26.   param (
  27.     [Parameter(ParameterSetName = "StreamSet", Mandatory = $true)]
  28.     [ValidateNotNullOrEmpty()]
  29.     [System.IO.Stream]$Stream,
  30.     [Parameter(ParameterSetName = "PathSet", Mandatory = $true, Position = 0)]
  31.     [ValidateNotNullOrEmpty()]
  32.     [System.String]$Path,
  33.     [Parameter(Mandatory = $false, Position = 1)]
  34.     [System.UInt32]$ReadCount = 1024
  35.   )
  36.   $utf8BOMThrow = New-Object System.Text.UTF8Encoding -ArgumentList @($true, $true)
  37.   $utf8NoBOMThrow = New-Object System.Text.UTF8Encoding -ArgumentList @($false, $true)
  38.   $utf16LEBOMThrow = New-Object System.Text.UnicodeEncoding -ArgumentList @($false, $true, $true)
  39.   $utf16LENoBOMThrow = New-Object System.Text.UnicodeEncoding -ArgumentList @($false, $false, $true)
  40.   $utf16BEBOMThrow = New-Object System.Text.UnicodeEncoding -ArgumentList @($true, $true, $true)
  41.   $utf16BENoBOMThrow = New-Object System.Text.UnicodeEncoding -ArgumentList @($true, $false, $true)
  42.   # type encoding,bool bom,bool throw,Text.Encoding encoding,byte[] preamble,string strPreamble
  43.   $arrUTF8Bom = $utf8BOMThrow.GetPreamble()
  44.   $arrUTF16LEBom = $utf16LEBOMThrow.GetPreamble()
  45.   $arrUTF16BEBom = $utf16BEBOMThrow.GetPreamble()
  46.   
  47.   if ($PSCmdlet.ParameterSetName -eq "PathSet") {
  48.     try {
  49.       $Stream = New-Object System.IO.FileStream -ArgumentList @($Path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::Read)
  50.     } catch {
  51.       return $null
  52.     }
  53.   }
  54.   $byteBuff = New-Object byte[] -ArgumentList 3
  55.   $readCount = $Stream.Read($byteBuff, 0, 3)
  56.   if ($byteBuff[0] -eq $arrUTF8Bom[0] -and $byteBuff[1] -eq $arrUTF8Bom[1] -and $byteBuff[2] -eq $arrUTF8Bom[2]) {
  57.     # utf8bom
  58.     $return = $utf8BOMThrow
  59.   } elseif ($byteBuff[0] -eq $arrUTF16LEBom[0] -and $byteBuff[1] -eq $arrUTF16LEBom[1]) {
  60.     # utf16lebom
  61.     $return = $utf16LEBOMThrow
  62.   } elseif ($byteBuff[0] -eq $arrUTF16BEBom[0] -and $byteBuff[1] -eq $arrUTF16BEBom[1]) {
  63.     # utf16bebom
  64.     $return = $utf16BEBOMThrow
  65.   } else {
  66.     # nobom
  67.     if ($ReadCount -gt 0) {
  68.       $charBuff = New-Object char[] -ArgumentList $ReadCount
  69.     }
  70.     # utf16-nobom 都被认为是ANSI编码
  71.     foreach ($encoding in @($utf8NoBOMThrow<# , $utf16LENoBOMThrow, $utf16BENoBOMThrow #>)) {
  72.       try {
  73.         $Stream.Position = 0
  74.         $sr = New-Object System.IO.StreamReader -ArgumentList @($Stream, $encoding, $false)
  75.         if ($ReadCount -gt 0) {
  76.           [void]$sr.Read($charBuff, 0, $ReadCount)
  77.         } else {
  78.           [void]$sr.ReadToEnd()
  79.         }
  80.         $return = $encoding
  81.         break
  82.       } catch {
  83.         
  84.       } finally {
  85.         if ($sr) {
  86.           $sr.Dispose()
  87.         }
  88.       }
  89.     }
  90.   }
  91.   if ($PSCmdlet.ParameterSetName -eq "PathSet") {
  92.     $Stream.Dispose()
  93.   }
  94.   if (!$return) {
  95.     $return = [System.Text.Encoding]::Default
  96.   }
  97.   return $return  
  98. }
  99. $reCJK = New-Object System.Text.RegularExpressions.Regex -ArgumentList @('\p{IsCJKUnifiedIdeographs}', 'Compiled, Ignorecase')
  100. # $reCJK = New-Object System.Text.RegularExpressions.Regex -ArgumentList @('\w', 'Compiled, Ignorecase')
  101. Write-Host $null
  102. Get-ChildItem -Path .\*.txt -Filter *.txt -Include *.txt | ForEach-Object {
  103.   if (-not $_.PSIsContainer) {
  104.     $encoding = Get-Encoding -Path $_.FullName
  105.     if ($null -eq $encoding) {
  106.       $encoding = [System.Text.Encoding]::GetEncoding(0)
  107.     }
  108.     try {
  109.       $dstfile = (Join-Path -Path $dirOut -ChildPath $_.Name)
  110.       $_.Name + " -> " + $dstfile | Write-Host
  111.       [System.IO.File]::WriteAllLines($dstfile, [string[]]@([System.IO.File]::ReadAllLines($_.FullName, $encoding) | ForEach-Object {
  112.             $str = $_
  113.             if ($替换前8) {
  114.               $cjkMatches = $reCJK.Matches($str)
  115.               if ($cjkMatches.Count -gt 0) {
  116.                 $index = $cjkMatches[[math]::Min($CJKCount - 1, $cjkMatches.Count - 1)].Index
  117.                 $str = ($str.Substring(0, $index + 1) -replace '[\p{P}]+', '') + $str.Substring($index + 1)
  118.               }
  119.             }
  120.             if ($替换后8) {
  121.               $cjkMatches = $reCJK.Matches($str)
  122.               if ($cjkMatches.Count -gt 0) {
  123.                 $index = $cjkMatches[[math]::Max(0, $cjkMatches.Count - $CJKCount)].Index
  124.                 $str = $str.Substring(0, $index) + ($str.Substring($index) -replace '[\p{P}]+', '')
  125.               }
  126.             }
  127.             $str
  128.           }), $encoding)
  129.     } catch {
  130.       $_ | Write-Host -ForegroundColor Red
  131.     }
  132.   }
  133. }
复制代码





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