2017-04-06 3 views
-1

私がする必要があるのは、テキストファイル(csv、すべてを1つのディレクトリに入れて)を作成し、出力全体が1行ずつ反転するファイルを作成することです。一番下に終わるのではなく、一番上にある。ForEachループを使用してcsvファイルをリバースする

私は1つのファイル(名前で)をとり、最初の行をコピーして、その行だけを含む新しいファイルを作成することができます。次に、元のファイルから最初の行を引いたものを配列に読み込んで逆にします。私はそれをヘッダーだけを持つファイルに追加します。それは出力名を除いてうまくいきますが、これは[file-REV.csv]になりましたが、これまでは[file.csv-REV]になっています...

これで作業が完了したら、プログラムはディレクトリ内のcsvのすべてを見つけ出し、それをループして、それぞれの逆ファイルを作成します。

これは私がこれまでにしたものである。そして、

cmdlet Get-Content at command pipeline position 1

Supply values for the following parameters:

Path[0]:

私はパス全体Get-Content -Path c:\users\jmurphy\working\に置くことを試みたと:ここ

cd c:\users\$([Environment]::UserName)\working 

$Path = "c:\users\$([Environment]::UserName)\working\" 

ForEach ($file in Get-ChildItem -Filter *.csv) { 
    Get-Content $file -totalcount 1 | Set-Content .\$file-REV.csv 
    $flip = (get-content | select -Skip 1) 
    [array]::Reverse($flip) 
    $flip | add-content "$file-REV.csv" 
} 

スクリプトを実行するときに、私が受け取るメッセージですパス全体を見つけることができないと不平を言う。

+2

私はお勧め最初の事は[ 'は、Get-ChildItemコマンドレットのヘルプ-Detailed'-取得](https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoftの出力を見ることです。 powershell.management/get-childitem)と['Get-Help Get-Content -Detailed'](https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.management/get-コンテンツ)。 'Get-Help'コマンドレットは、PowerShellの使い方を学ぶときに最も便利なコマンドレットです。 –

+1

他の潜在的な問題を無視して、 '$ flip =(get-content $ file | select -Skip 1)'というループからファイル名を 'Get-Content'に与えます。 _c:\ users \ jmurphy \ working_はファイルではなくフォルダです。 – Matt

+0

ありがとうございます。私はあなたの提案から始めます。私はGet-Helpについて知りませんでした(MS-manはそれが好きです)。ありがとう! –

答えて

1

カップルのもの。最初に、変数で作業するようにフォルダを定義しているので、Get-ChildItemでそのフォルダを使用してください。 ($Folderの名前は、$Pathがすでに環境スコープ内で変数として使用されているため、覚えていません。また、$env:は、環境スコープから変数を読み込むためのより簡単な方法です)。

$Folder = "C:\Users\$env:UserName\working\" 
$Files = Get-ChildItem $Folder -Filter *.csv 

第二に、あなたはちょうどそれは、各ファイルの完全なパスだからGet-ChildItemから返されているものからFullnameプロパティを使用したいと思います。

ForEach ($File in $Files) { 

つまり、あなたのGet-Content

Get-Content $File.Fullname -totalcount 1 | Set-Content .\$($file.Basename)-REV.csv 

のファイルにその完全なパスを使用したいと思うし、あなたが再びGet-Contentを呼び出すときに、ファイルへのパスとして再び$Fileを使用したいと思います:

$Flip = (Get-Content $File.Fullname | Select -Skip 1) 

Basenameは、拡張子のないファイル名だけでGet-Childitemからプロパティです。 $()で囲むことで、二重引用符で囲まれた変数のプロパティの評価を強制することができます。

$Flip | Add-Content "$($file.Basename)-REV.csv" 

すべて一緒にスクリプトは次のようになります。

$Folder = "C:\Users\$env:UserName\working\" 
$Files = Get-ChildItem $Folder -Filter *.csv 
ForEach ($File in $Files) { 
    Get-Content $File.Fullname -totalcount 1 | Set-Content .\$($file.Basename)-REV.csv 
    $Flip = (Get-Content $File.Fullname | select -Skip 1) 
    [array]::Reverse($Flip) 
    $Flip | Add-Content "$($file.basename)-REV.csv" 
} 
+0

ヘイ・ベン、優れた答え!コードブロック全体を文字列として解釈するのではなく、StackOverflow構文の強調表示が正しく機能するように、パス内の末尾のスラッシュを削除する必要があります。 (バックスラッシュはC#のような他の言語のエスケープ文字です) – Bluecakes

+0

@Bluecakes本当に必要はありません。編集を見てください。これが起きたときには、ソースをあまり変更しないように '<! - language-all:lang-cs - > 'を使います。それは完璧ではないが少し良いです – Matt

+0

その高価ではないいずれかの方法だけでファイルを一度に読んでそれに応じて分割しないでください。また、私はあなたがfullnameプロパティを排他的に使用する必要はないと思う '$ file'だけで動作します。 – Matt

0

ジョーは、あなたはPowerShellを学んで大活躍しています。もう少しオブジェクト指向の力を活用するだけです。

Get-ChildItemがファイルに関するオブジェクトを返すことは既にわかっています。あなたが知る必要があるのは、そのオブジェクトに含まれるメンバーです。それを見つけるためにGet-Memberを使用してください。

$file = Get-ChildItem .\t.csv 
$file | Get-Member 

興味のあるメンバーを見つけたら、その値が何であるかを確認します。

$file.Name 
$file.Extension 
$file.BaseName 

これにより、新しいファイル名を作成できます。

$newFilename = $file.Basename + '-REV' + $file.Extension 

Get-Content行の前にこれを挿入します。次に、Add-Contentで$ newFilenameを使用します。

関連する問題