本帖最后由 WHY 于 2023-3-3 15:59 编辑
PowerShell 脚本,保存为Test.ps1,右键使用PowerShell运行
运行之前把杀软的文件实时监控关掉,否则频繁的磁盘操作CPU会达到100%,也会拖慢脚本速度
2023/03/03修改,假定每一行数据长度都相同,先创建一个N选M组合的索引表,每行数据按表搜索。- $MyPath = $MyInvocation.MyCommand.Path -replace '\\[^\\]*$', '\'; #脚本自身路径
- $srcFile = $MyPath + '1.txt'; #源文件
- $dstFolder = $MyPath + 'result'; #目标目录
-
- If (![IO.Directory]::Exists($dstFolder)){
- $null = md $dstFolder;
- }
-
- Function Get-Combination($n, $m){
- $key = 1;
- $str = '1' * $m + '0' * ($n-$m); #11111000000000000000000000000000 共32位
- $m = [regex]::Matches($str, '1');
- $Hash.Add($key, $m.Index); #HashTable赋初始值
- while ($str.IndexOf('10') -ge 0) {
- $str = $str -replace '10(?>(0*))(?>(1*))$', '01$2$1'; #交换 10 <--> 01
- $m = [regex]::Matches($str, '1');
- $Hash.Add(++$key, $m.Index); #HashTable赋值
- }
- }
-
- Function Set-ContentToFile($oDict){
- forEach($key In $oDict.Keys){
- $dstFile = $dstFolder + '\' + (''+$key).PadLeft(6, '0') + '.txt'; #目标文件名
- [IO.File]::AppendAllText($dstFile, $oDict[$key], [Text.Encoding]::Default); #写入文件
- }
- }
-
- $Hash = New-Object System.Collections.HashTable;
- $n = 32; $m = 5; #32选5组合
- Get-Combination $n $m #创建索引表,存放到$Hash中
-
- $arr = [IO.File]::ReadAllLines($srcFile, [Text.Encoding]::Default); #读源文本
- $dic = New-Object 'System.Collections.Generic.Dictionary[int, string]'; #字典,存放结果
- $num = 0;
-
- for($i=0; $i -lt $arr.Count; $i++){
- $chr = [char[]]$arr[$i]; #转成字符数组
- forEach( $key In $Hash.Keys ){ #遍历索引表
- $s = '';
- for ($j = 0; $j -lt $m; $j++){
- $index = $Hash[$key][$j];
- $s += $chr[$index];
- }
- If (!$dic.ContainsKey($key)) { $dic.Add($key, ''); }
- $dic[$key] += $s + "`r`n"; #字典赋值
- }
- If (++$num % 2 -eq 0){ #每读取2行数据开始写入文件
- Set-ContentToFile $dic;
- $dic.Clear(); #清空字典
- }
- }
-
- If ($dic.Count -gt 0){ #字典不为空,写入文件
- Set-ContentToFile $dic;
- }
-
- echo 'DONE';
- [Console]::ReadLine();
复制代码
|