2016-05-16 21 views
2

古い投稿を見ていましたが、文字列の空白を置き換えて配列として使用する方法を特定できませんでした。文字列から空白を削除し、配列内で使用する

入力ファイルは行から構成されています

-rw-r--r-- 1 myuser admin 315279199 May 12 02:46 2016_05_12_backup.tar.gz 
-rw-r--r-- 1 myuser admin 315278122 May 13 04:56 2016_05_13_backup.tar.gz 

私は次のような出力を受信したい:

program executed on 2016-05-16/12:18:06 
to unix: 
rm -fr 2016_05_12_backup.tar.gz 
rm -fr 2016_05_13_backup.tar.gz 


to excel log: 
2016_05_12_backup.tar.gz 
2016_05_13_backup.tar.gz 

=============== END ============== 

私のコードはここにある:

$path_in = "C:\test\input.txt" 
$path_out = "C:\test\output.txt" 

$endMessage = "=============== END ==============" 

$reader = [System.IO.File]::OpenText($path_in) 
$get_time_message = "program executed on " + [datetime]::now.ToString('yyyy-MM-dd/HH:mm:ss') 

try { 

add-content $path_out $get_time_message 
add-content $path_out "to unix: " 

$long_string_to_excel ="" 


    while($true){ 
     $line = $reader.ReadLine() 

     if ($line -eq $null) { break } 

     # divide the input line into array - remove white space 
     # it is hard coded here below for the lines that consist two and three space characters 

     $better_line = $line.replace(' ',' ') 
     $best_line = $better_line.replace(' ',' ').split(' ') 

     $stringToOutput = "rm -fr " + $best_line[8] 

     $long_string_to_excel = $long_string_to_excel + $best_line[8] + "`r`n" 

     add-content $path_out $stringToOutput 

    } 

    add-content $path_out "`n" 
    add-content $path_out "to excel log: " 
    add-content $path_out $long_string_to_excel 
    add-content $path_out $endMessage 

} 
finally { 
    $reader.Close() 
} 
write-host "program execution:`ncompleted" 

このスクリプトは、[OK]を動作しますが、 2行と3行のスペース文字で構成された入力行に対しては「難しい」コードになっています。私の代わりに

$better_line = $line.replace(' ',' ') 
    $best_line = $better_line.replace(' ',' ').split(' ') 

$better_line = $line.replace(' +', ' '); 
    $best_line = $better_line.split(' ') 

を使用していたが、結果が正しくありません:

program executed on 2016-05-16/12:18:04 
to unix: 
rm -fr 315279199 
rm -fr 315278122 


to excel log: 
315279199 
315278122 

=============== END ============== 

スクリプトので、ハードコーディングされた部品を交換する方法ソリューションについて助言してもらえ1行に任意のタイプの空白文字を入力できますか?代わりに、静的String.Split()方法の

答えて

4

、組み込み-split operator使用 - あなたは、たとえば、「1つの以上のスペース」によって分割するために使用することができますので、それは正規表現をサポートしています。空の項目を削除する方法 -

PS C:\> "a b" -split '\s+' 
a 
b 
PS C:\> "a b" -split '\s+' 
a 
b 
+0

ありがとう!スクリプトは完璧に動作します。 – paul543

2

直感的アプローチ:アレイ内の各項目をチェックし、それが空であるかどうかを確認か

$best_line = $line.split(' ') | ? {$_} 
PowerShellの配列から

言説(.NET)アプローチ:String.Split Method (String[], StringSplitOptions)

$best_line = $line.split(' ',[System.StringSplitOptions]::RemoveEmptyEntries) 

型:System.StringSplitOptions

  • StringSplitOptions.RemoveEmptyEntries返される配列から空の配列要素を省略します。または
  • StringSplitOptions.None配列に空の配列要素を含めます。
+0

ありがとうございました。私はSystem.StringSplitOptionsをチェックするつもりです。 – paul543

関連する問題