2016-08-01 9 views
0

Ich versuche, diese folgende Abfrage Schleife durchlaufen und alle Textdateien im aktuellen Verzeichnis aufgeteilt. Ich habe derzeit zwei verschiedene Dateien namens TestingInfo[1] & TestingInfo[2].Schleife für txt geteilte Datei

Verzeichnis, in dem Dateien gespeichert sind: \\C\users$\Pepe\Desktop\TestInfoFolder

Die Dateien wie folgt aussehen:

TestingInfo[1]:

[IMPORT] 
1 
2 
3 
[IMPORT] 
4 
5 
6

TestingInfo[2]:

[IMPORT] 
7 
8 
9 
10

-Code Ich habe bisher:

$Path = "\\C\users$\Pepe\Desktop\TestInfoFolder" 
$InputFile = (Join-Path $Path "TestingInfo[1].txt") 
$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 
} 
+1

Es gibt ein paar Dinge, die ich hier sehe. Sie erklären nicht gut, was Sie zu erreichen hoffen. Möchten Sie 3 Ausgabedateien? Was erwarten Sie von ihnen? Wie sollen sie benannt werden? Außerdem ist "[IMPORT]" 'keine gute Regex-Übereinstimmung für Ihr' -Match'-Argument. Das passt zu jeder Zeile, die mindestens eines der Zeichen I, M, P, O, R oder T enthält. ([Beispiel hier] (https://regex101.com/r/kV3wZ7/1)) – TheMadTechnician

+0

An Beispiel wo 'Select-String -Between 'IMPORT', um alle Importgruppen in einem Zug auszuwählen, ordentlich ist, wenn es existiert. Stimmen Sie dafür, wenn Sie auch denken, dass es ordentlich wäre: https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/14951235-add-parameters-to-select-string-for-matching-all-l – TessellatingHeckler

+0

Was ich zu erklären versuchte, ist, dass ich zwei Dateien habe, die den oben angegebenen Text enthalten. Die erste Datei, TestingInfo [1], enthält zwei Sätze von Datensätzen, die ich in separate Dateien extrahieren muss, und der zweite Dateitest, TestingInfo [2], hat einen. Ich möchte die Funktion, um jeden dieser Blöcke unabhängig davon zu trennen, wie viele Dateien in dem Verzeichnis sind. Es ist egal, wie sie benannt sind. Etwas wie "TestingInfo [1] _N", wobei N der Anzahl der Blöcke entspricht, die aus der Datei stammen. –

Antwort

0

Ihre Art, es auf die harte Tour zu tun, die .NET-Bibliotheken direkt aufzurufen.

Dieser Ansatz sollte ungefähr richtig und viel einfacher/im Einklang mit PowerShell sein.

$curFileContents 
$i = 0 

Get-ChildItem "pathOfFiles\" | { 
    Get-Content $_ | ForEach-Object { 
     $line = $_.Split(" ") 
     foreach ($word in $line) 
     { 
      if ($word -match "[INPUT]") 
      { 
       $i++ 
      } 
      else 
      { 
       $curFileContents += $word + " " 
      } 
     } 
     $curFileContents | Out-File -FilePath "PathToFile\output$i.txt" 
    } 
} 

Textdateien gibt, wo der Inhalt wie folgt aussieht:

Code wiederverwenden und das Hinzufügen in dem Artikel Get-Kind aussehen würde:

$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 
    } 
} 
+0

In Ihrem Code sehe ich das wiederholt die testInfo [1] -Datei zweimal. Ich muss alle Teile der Daten in beiden Dateien in separate Dateien verschütten. In meinem Code kann ich das tun, aber ich kann nicht alle Dateien im Verzeichnis durchlaufen und dasselbe machen. Die ursprüngliche Datei "TestingInfo1" wird also in zwei separate Dateien aufgeteilt: Ergebnisdatei 1: [IMPORT] 1 2 3 Ergebnisdatei 2: [IMPORT] 4 5 6 –

+0

Originaldatei "TestingInfo [2]". Die resultierende Datei wird Ergebnisdatei 1 sein: [IMPORT] 7 8 9 10 –

+0

Ah, das ist einfach genug. Wickeln Sie einfach alles in get-childitem und ersetzen Sie den Dateinamen früher durch $ _ oder $ _. FullName (oben bearbeitet) –