2016-08-01 15 views
0

私はこの後続のクエリループを作成し、現在のディレクトリ内のすべてのテキストファイルを分割しようとしています。私は現在、TestingInfo[1] & TestingInfo[2]という名前の2つの異なるファイルを持っています。ファイルが置かれtxt分割ファイルのループ

ディレクトリ:\\C\users$\Pepe\Desktop\TestInfoFolder

ファイルは次のようになります。

TestingInfo[1]

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

TestingInfo[2]

[IMPORT] 
7 
8 
9 
10

コード私がこれまで持っている:

$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

ここにはいくつかのことがあります。あなたは、あなたが達成しようとしていることをうまく説明していません。 3つの出力ファイルが必要ですか?あなたはそれらに何が含まれると思いますか?名前はどうしたらいいですか?また、 '' [IMPORT] ''はあなたの '-match'引数の正規表現には適していません。これは、I、M、P、O、R、またはTの文字のうちの少なくとも1つを含む行に一致します([ここの例を参照](https://regex101.com/r/kV3wZ7/1)) – TheMadTechnician

+0

ここでは、「Select-String - 1つの移動内のすべてのインポートグループを選択するための 'IMPORT'の間に、存在する場合はきちんとしてください。あなたもそれがきちんとしていると思うなら、それに投票してください:https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/14951235-add-parameters-to-select-string-for-matching-all-l – TessellatingHeckler

+0

私が説明しようとしたのは、上記のtxtを含む2つのファイルがあるということです。最初のファイルTestingInfo [1]には、別々のファイルに抽出する必要のある2セットのレコードと、2つ目のファイルテストがあります。TestingInfo [2]には1つあります。ディレクトリ内のファイルの数に関係なく、これらのブロックのそれぞれを分離する機能が欲しいです。名前が何であるかは関係ありません。 "TestingInfo [1] _N"のようなもの(Nはファイルから来たブロック数に等しい)。 –

答えて

0

.NETライブラリを直接呼び出すという難しい方法です。

このアプローチは正しいと思いますが、PowerShellの方がはるかにシンプルです。

はあなたのコードを再利用し、次のようになります。get-子アイテムに追加:

のようにコンテンツが見えますテキストファイルを与える

$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" 
    } 
} 

$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

コードでは、 testingInfo [1]ファイルを2回繰り返します。私は両方のファイルのすべてのチャンクを別々のファイルに書き込む必要があります。私のコードでは、これを行うことができますが、ディレクトリ内のすべてのファイルをループすることはできません。したがって、元の "TestingInfo1"ファイルは2つの別々のファイルに分割されます。結果ファイル1:[IMPORT] 1 2 3結果ファイル2:[IMPORT] 4 5 6 –

+0

オリジナルファイル "TestingInfo [2]"。結果ファイルは結果ファイル1:[IMPORT] 7 8 9 10 –

+0

ああ、それは簡単です。 get-childitemですべてをラップし、ファイル名を$ _または$ _で先に置き換えます。FullName(上記で編集) –

関連する問題