Board logo

标题: [文本处理] 求助在TXT每行随机位置添加指定字符的BAT代码 [打印本页]

作者: wwwstwyb2    时间: 2018-12-18 00:04     标题: 求助在TXT每行随机位置添加指定字符的BAT代码

我想实现在一个TXT里,在每一行的随机位置,插入指定的五个字符。具体怎么实现呢,毫无头绪。
举例,我想在每一行当中,分别插入“AA”,“BB”,“CC”,“DD”和“EE”
假设TXT里有三行:
12345678
87654321
66666666
经过批处理指令后,在每一行随机位置插入之后,处理结果就可能变成这样:
1AABB234CC5DD67EE8
876AA5BB4CC3DD2EE1
AA6BB66CC66DD66EE6
请问怎么实现,先谢谢大神了。
作者: codegay    时间: 2018-12-18 05:32

相当于两个list相连,然后shuffle打乱就可以了。
[1, 2, 3] + [a, b, c]
打乱后重新拼接成字符串。
作者: codegay    时间: 2018-12-18 05:46

是否允许字符插入后到行末?
类似变成
1aa2bb3cc
作者: flashercs    时间: 2018-12-18 06:20

本帖最后由 flashercs 于 2018-12-18 06:43 编辑

随机插入字符.bat
  1. @echo off
  2. for /f "tokens=1 delims=:" %%A in ('findstr /n "#######*" %0') do more +%%A %0 >"%~dpn0.ps1"
  3. powershell.exe -ExecutionPolicy Bypass -File "%~dpn0.ps1"
  4. pause
  5. exit /b
  6. ##################################################################
  7. # filePath,relative to the script directory or absolute path.设置文件路径,相对或绝对
  8. $filePath = '10.txt'
  9. # inserted string list.设置插入字符串列表
  10. $strInsert = @('AA', 'BB', 'CC', 'DD', 'EE')
  11. if (![System.IO.Path]::IsPathRooted($filePath)) {
  12.   $filePath = [System.IO.Path]::Combine([System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition), $filePath)
  13. }
  14. function getInsertPosition {
  15.   param (
  16.     [string]$str,
  17.     [string[]]$arrInsertStr
  18.   )
  19.   $a = [System.Array]::CreateInstance([int], $arrInsertStr.Count)
  20.   $len = $str.Length + 1
  21.   for ($i = $a.Count - 1; $i -ge 0 ; $i--) {
  22.     $a[$i] = Get-Random -Minimum 0 -Maximum $len
  23.   }
  24.   $a = $a|Sort-Object
  25.   return $a
  26. }
  27. (Get-Content -LiteralPath $filePath -Encoding Default|ForEach-Object {
  28.   $arr = getInsertPosition -str $_ -arrInsertStr $strInsert
  29.   $index = 0
  30.   $s = ''
  31.   for ($i = 0; $i -lt $arr.Count; $i++) {
  32.     $s += $_.Substring($index, $arr[$i] - $index) + $strInsert[$i]
  33.     $index = $arr[$i]
  34.   }
  35.   $s += $_.Substring($index)
  36.   $s
  37. })|Set-Content -LiteralPath $filePath -Encoding Default
复制代码

作者: wwwstwyb2    时间: 2018-12-18 14:32

回复 4# flashercs


   谢谢大神,如果代码要加两个条件,比如空格跳过,还有不添加到行的首和尾,这个能实现吗
作者: flashercs    时间: 2018-12-18 14:40

本帖最后由 flashercs 于 2018-12-18 14:42 编辑

回复 5# wwwstwyb2


    空行跳过?还是空格?
不添加到行首/尾?如果一行一共1个字符怎么不添加到行首尾?
你的举例也是添加到行首了....
作者: xczxczxcz    时间: 2018-12-18 21:18

第一个字符和最后一个字符之间,两个字符以上才会添加。
  1. $插入字符=@('祝','大家','猪年','元旦','快乐')
  2. Function EachLine {
  3. Param ([string]$Line)
  4. [Collections.ArrayList]$行字符=@($Line.toCharArray())
  5. $随机数=(1..$插入字符.Count)|%{get-random -input (1..($Line.Length -1))}|sort
  6. for ($i=$插入字符.Count -1; $i -ge 0; $i--){$行字符.Insert($随机数[$i],$插入字符[$i])}
  7. $NewStr=-join $行字符
  8. $NewStr
  9. }
  10. Get-Content ref.txt|ForEach-Object{if($_.Length -ge 2) {EachLine $_} else {$_}}
复制代码





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