本帖最后由 xczxczxcz 于 2025-3-8 18:17 编辑
回复 4# 思想之翼
若非 hawk :
给你来个 “大的”- class CombineDigitHelper{
- [string]$directory; # a.txt; b.log;
- [string]$SplitDirectory; # 1234.txt; 1235.txt ...
- [object[]]$comb; # 组合
-
- # 指定分割文本和总文本的目录
- CombineDigitHelper([string]$dir){
- if(![IO.Directory]::Exists($dir)){
- [IO.Directory]::CreateDirectory($dir);
- }
- $this.directory=$dir;
- $this.comb=@();
- $this.SplitDirectory=[IO.Path]::Combine($this.directory, "Split");
- if(![IO.Directory]::Exists($this.SplitDirectory)){
- [IO.Directory]::CreateDirectory($this.SplitDirectory);
- }
- }
-
- # 分割文件的组合,分割时要先运行此方法
- [void] CombDigit([string]$file, [int]$sel){
- $_f=[IO.Path]::Combine($this.directory, $file);
- $_o=[string[]](Get-Content $_f -ReadCount 0);
- $obj=1..$_o[0].Length;
- $select=[int[]]::new($sel);
- 0..($sel-1)|ForEach-Object{$select[$_]=$_}
-
- while($true){
- $str="";
- for($i=0; $i -lt $sel; $i++){$str+=$obj[$select[$i]].ToString()}
- $this.comb+=$str;
- if($select[$sel-1] -lt $obj.length-1){$select[$sel-1]++}
- else{
- $p=$sel-1;
- while(($p -gt 0) -and ($select[$p-1] -eq $select[$p]-1)){$p--}
- if($p -eq 0) {break;}
- $select[$p-1]++;
- for($j=$p; $j -lt $sel; $j++){
- $select[$j] =$select[$j-1]+1;
- }
- }
- }
- }
-
- # 制作总文本并指定每行为7个字符
- [void] MakeContent([string]$file, [int]$count){
- $this.MakeContent($file, $count, 7);
- }
-
- # 制作总文本并指定每行为任意个字符
- [void] MakeContent([string]$file, [int]$count, [int]$tol){
- # $source=[string[]]("1234567890abcdefghijklmnopqrstuvwxyz".ToCharArray());
- $source=1..9;
- $destfile=[IO.Path]::Combine($this.directory, $file);
- [IO.File]::CreateText($destfile).Close();
- for($i=0;$i-lt$count;$i++){
- $data=Get-Random -InputObject $source -Count $tol;
- Add-Content $destfile -Value (-join($data)) -Encoding Default -Force;
- }
- }
-
- # 分割文本
- [void] SplitContent([string]$sourceFile){
- if($this.comb.Length -eq 0){
- Write-Host '先生成文件组合再分割' -fore red;
- return;
- }
- $a=[IO.Path]::Combine($this.directory, $sourceFile);
- $Atxt=[string[]](Get-Content $a -ReadCount 0);
-
- foreach($txt in $this.comb){
- $file=[IO.Path]::Combine($this.SplitDirectory, "$txt.log");
- [IO.File]::CreateText($file).Close();
- $sb=[Text.StringBuilder]::new();
- for($j=0;$j -lt $Atxt.Length; $j++){
- if($Atxt[$j] -match '^$'){continue;}
- [string]$line="";
- for($i=0; $i -lt $txt.length; $i++){
- [int]$_i=[string]$txt[$i];
- $line+=$Atxt[$j][$_i-1];
- }
- [void]$sb.Append($line+"`r`n");
- }
- Set-Content $file -Value $sb.ToString().Trim() -Enc Default -NoNewline -Force;
- }
- }
-
- # 合并文本
- [void] MergeToFile([string]$destFile){
- $file=[IO.Path]::Combine($this.directory, $destFile);
- $outContentArr=@();
- $logs=[IO.Directory]::GetFiles($this.SplitDirectory, "*.log");
- $max=[Collections.Generic.HashSet[object]]($logs.Foreach{(Get-Item $_).BaseName.ToCharArray()});
-
- foreach($log in $logs){
- $bName=[string]([IO.Path]::GetFileNameWithoutExtension($log));
- $content=[string[]](Get-Content $log -ReadCount 0);
- if($outContentArr.Count -eq 0){
- for($i=0; $i -lt $content.Length; $i++){
- $outContentArr+=,[string[]]::new($max.Count);
- }
- $max.Clear();
- }
-
- for($i=0;$i -lt $content.Length;$i++){
- for($a=0; $a -lt $bName.Length; $a++){
- [int]$t=[string]$bName[$a]
- if(![string]::IsNullOrEmpty($outContentArr[$i][$t-1])){continue}
- $outContentArr[$i][$t-1]=$content[$i][$a];
- }
- }
- }
-
- $_out=@($outContentArr.ForEach{-join($_)}) -join "`r`n";
- Set-Content $file -Value $_out -Encoding Default -NoNewline -Force;
- }
-
- # 删除合并文本和分割文本及相关目录
- [void] ClearTxt([bool]$delSubDir){
- if($null -ne $this.comb){$this.comb.Clear()}
- $this.comb=$null;
- try{
- [IO.Directory]::Delete($this.SplitDirectory, $true);
- [IO.Directory]::Delete($this.directory, $delSubDir);
- }catch{}
- }
- }
-
- # 食用,不要把脚本放在制作目录中 ;实例化,换成自己的目录
- $comb=[CombineDigitHelper]::new("F:\WinTemp\Temp\Combine\");
- # 生成随机数创建A.txt 1000=行数 8=每行字符数,默认为7,有现存的则不执行此句
- $comb.MakeContent("a.txt", 1000); # $comb.MakeContent("a.txt", 1000, 8);
-
- # 下面的方法按需要运行
- # 分割文本 4=按4个字符组合
- $comb.CombDigit("a.txt", 4);
- $comb.SplitContent("a.txt");
- # 合并文件
- $comb.MergeToFile("b.txt");
- # 清除文件,会清除所有文件,注意备份
- $comb.ClearTxt($false);
复制代码
 |