用于将多个txt文件拆分为单独文件的Powershell循环

用于将多个txt文件拆分为单独文件的Powershell循环,powershell,powershell-2.0,powershell-3.0,Powershell,Powershell 2.0,Powershell 3.0,我在目录中的所有文件中循环出现问题,并根据“[IMPORT]”字段将其拆分 目录:\C\users$\Pepe\Desktop\testinfo文件夹 我在目录中有以下两个文件: testinginfo.txt testinginfo.txt [IMPORT] 21 22 23 24 25 它们看起来是这样的: testinginfo.txt [IMPORT] 1 2 3 4 5 6 7 8 9 10 [IMPORT] 11 12 13 14 15 16 17 18 19 20 testin

我在目录中的所有文件中循环出现问题,并根据“[IMPORT]”字段将其拆分

目录:\C\users$\Pepe\Desktop\testinfo文件夹

我在目录中有以下两个文件: testinginfo.txt testinginfo.txt

[IMPORT]
21
22
23
24
25
它们看起来是这样的:
testinginfo.txt

[IMPORT]
1
2
3
4
5
6
7
8
9
10
[IMPORT]
11
12
13
14
15
16
17
18
19
20
testinginfo.txt

[IMPORT]
21
22
23
24
25
期望的结果是3个单独的文件拆分字符串“[IMPORT]”,该字符串包含在文件中

结果1:

[IMPORT]
1
2
3
4
5
6
7
8
9
10
结果2:

[IMPORT]
11
12
13
14
15
16
17
18
19
20
结果3:

[IMPORT]
21
22
23
24
25
当前代码:

$Path = "\\C\users$\Pepe\Desktop\TestInfoFolder"
Get-ChildItem $Path | foreach-object {
   $InputFile = $_.FullName
   $Reader = New-Object System.IO.StreamReader($InputFile)
   $N = 1

While (($Line = $Reader.ReadLine()) -ne $null) {
   if ($Line -match "[IMPORT]") {
       $OutputFile = $matches[0] + $N + ".txt"
       $N++
   }

   Add-Content (Join-Path $Path $OutputFile) $Line
   }
}

当前查询的问题是,它将testinginfo.txt的结果附加到结果1的结果中。请让我知道,如果你需要任何进一步的澄清

正则表达式是您在这里的朋友。这将为您提供来自$Path中所有文件的导入序列的所有实例:

ls $Path | cat | select-string -AllMatches "(\[IMPORT\][\s*\d+]+)" | % {$_.Matches.Value}

我会这样做:

$SourcePath = "C:\Users\jon_dechiro\Desktop\Test"
$OutputPath = "C:\Temp"
$Count = 1
foreach ($File in (Get-ChildItem -Path $SourcePath -File))
{
    $FileRawContents = Get-Content $File.FullName -Raw
    foreach ($Import in ($FileRawContents -split '\[IMPORT\]'))
    {
        if ($Import -match '\d')
        {
            $ImportEdited = $Import -replace '\n', "`r`n"
            "[IMPORT]$ImportEdited" | Out-File "$OutputPath\Results$Count.txt"
            $Count++
        }
    }
}

它打开每个文件并按[IMPORT]进行拆分,然后将每个结果发送到您指定的输出文件。当然,根据需要更改$SourcePath和$OutputPath变量。

我会做一些类似于Jon Dechiro的事情,但我会将所有文本收集到一个变量中作为多行字符串,然后将其拆分为包含从一个
[IMPORT]
到下一个变量(或文件末尾)的所有内容的块,然后在
FOR
循环中输出每个项目:

$Path = "C:\Users\Pepe\Desktop\TestInfoFolder"
$InputText = (Get-Content "$Path\*.txt" -Raw) -join "`r`n"
$SplitText = $InputText -split "(?s)(\[IMPORT].*?)(?=\[IMPORT]|$)"|?{$_}
New-Item -Path $Path\Output -ItemType Directory -Force|Out-Null
For($i=0;$i -le $SplitText.Count;$i++){
    $SplitText[$i] | Set-Content "$Path\Output\Results$($i+1).txt" -Force
}

这将在路径中创建一个文件夹“Output”,并将结果保存在那里。

因为您所有的导入都是同一个单词,并且它从每个文件的开头开始。将
$N=1
放在
Get ChildItem
行之前,它将永远计数;这个解决方案现在不起作用了,因为我看到数字在不同的行上。这很好,但生成的文件不会在读取的每行后面插入回车符。在它读入的行之后,我将如何添加回车符呢?例如,如果将读取[IMPORT]CR LF在我的系统上使用Notepad++进行检查,则显示在由我发布的代码创建的输出中的每一行之后都有一个CR LF。你的系统不是这样吗?在原始文件中,它们只包含“数据线”LF,我希望它插入它,使其显示为“数据线”CR LF。无论如何,我能做到吗?我编辑了我的测试文件,删除了CR,只有LF。我编辑了答案,包括用CR LF替换LF的步骤。这对我的系统有效。看看这对你是否有效。效果很好。非常感谢你。这给了我一个很好的工作场所。我对你感激不尽。