質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

44060閲覧

【PowerShell】CSVファイルを1行ずつ読み込み、値を編集加工し、別のCSVファイルを作成する。

watan

総合スコア13

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2017/02/08 06:28

###前提・実現したいこと
PowerShell初心者です。

CSVファイルを読み込み、入力レコードを元に値を作成したもので、別CSVファイルを作成するスクリプトを作っています。

1行づつ処理をした結果をカスタムオブジェクトへ格納し、それをCSV 出力・・としようとしていますが、配列をうまく進めることができません。

###該当のソースコード
言語:PowerShell

<入力ファイル:input.csv>
"Col1","Col2","Col3","Col4","Col5","Col6","Col7"
"November 1, 2016","","AAA","BBB","2016/12/02",1,1
"November 2, 2016","","AAA","CCC","2016/11/18",1,1
"November 3, 2016","","DDD","EEE","2016/11/25",1,1

<出力ファイル>
"Date1","Date2","Date3","Date4","Str1","Str2","Num_当年","Num_前年"

<プログラム:MakeCSVTest.ps1>
$Infile = 'C:\Users\n0000437\CHK\input.csv'
$Outfile = 'C:\Users\n0000437\CHK\OutFile.csv'

$opBSDT = ([datetime]$args[0]).tostring("yyyy/MM/dd")
$dpBSDT = ([datetime]$args[1]).tostring("yyyy/MM/dd")

"基準日1:$opBSDT"
"基準日2:$dpBSDT"

function ReadYoyaku{

$OutLines = New-Object System.Collections.ArrayList $OutLine = New-Object PSObject | Select-Object "Date1","Date2","Str1","Str2","Num_当年","Num_前年" $OutLines | ft -AutoSize Import-Csv $Infile | ForEach-Object { $SDate1=([datetime]$_.Col1).tostring("yyyy/MM/dd") $OutLine.Date1 = $SDate1 if( $SDate1 -lt $opBSDT ) { $OutLine.Date2 = ([datetime]$_.Col1).AddDays(+364).tostring("yyyy/MM/dd") } else { $OutLine.Date2 = $SDate1 } $OutLine.Str1 = $_.Col3 $OutLine.Str2 = $_.Col4 if( $SDate -lt $dpBSDT ) { $OutLine.Num_当年 = 0 $OutLine.Num_前年 = $_.Col7 } else { $OutLine.Num_当年 = $_.Col7 $OutLine.CV_前年 = 0 } [void]$OutLines.Add($OutLine)

$OutLines | ft -AutoSize
}
$OutLines | ft -AutoSize
}
ReadYoyaku

<起動>
起動時に日付をパラメータ渡しします。

.\MakeCSVTest.ps1 2017/1/1 2016/1/1

###問題・困っていること
出力結果が、入力ファイルの最後のレコードですべて置き換わってしまいま

上記実行結果が↓のようになってしまいます。

Date1 Date2 Str1 Str2 Num_当年 Num_前年


2016/11/03 2017/11/02 DDD EEE 0 6
2016/11/03 2017/11/02 DDD EEE 0 6
2016/11/03 2017/11/02 DDD EEE 0 6

こうなってほしい↓
Date1 Date2 Str1 Str2 Num_当年 Num_前年


2016/11/01 2017/10/31 AAA BBB 0 2
2016/11/02 2017/11/01 AAA CCC 0 4
2016/11/03 2017/11/02 DDD EEE 0 6

###補足情報(言語/FW/ツール等のバージョンなど)

$PSVersionTable

Name Value


CLRVersion 2.0.50727.5485
BuildVersion 6.1.7601.17514
PSVersion 2.0
WSManStackVersion 2.0
PSCompatibleVersions {1.0, 2.0}
SerializationVersion 1.1.0.1
PSRemotingProtocolVersion 2.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

$OutLineのインスタンスがループ(ForEach-Object)の前に作成されていてループの中では同じインスタンスに上書きしてます。
で$OutLinesにaddしてますが同じインスタンスの参照をaddしてるので最後のデータになってしまいます。

PowerShell

1function ReadYoyaku{ 2 3$OutLines = New-Object System.Collections.ArrayList 4# ここではなく 5# $OutLine = New-Object PSObject | Select-Object "Date1","Date2","Str1","Str2","Num_当年","Num_前年" 6 7$OutLines | ft -AutoSize 8 9Import-Csv $Infile | ForEach-Object { 10 # ここでOutLineのインスタンスを作成してください。 11 $OutLine = New-Object PSObject | Select-Object 12 $SDate1=([datetime]$_.Col1).tostring("yyyy/MM/dd") 13 14# ・・・・略・・・・

補足すると、以下のようなことです。[void]$OutLines.Add($OutLine)の後で$OutLine.Date1='BBB'とすると、$OutLinesに追加したものも'BBB'になります。

PS C:> $OutLine = New-Object PSObject | Select-Object "Date1","Date2","Str1","Str2","Num_当年","Num_前年"
PS C:> $OutLines = New-Object System.Collections.ArrayList
PS C:> $OutLines
PS C:> $OutLine.Date1='AAA'
PS C:> [void]$OutLines.Add($OutLine)
PS C:> $OutLines

Date1 : AAA
Date2 :
Str1 :
Str2 :
Num_当年 :
Num_前年 :

PS C:> $OutLine.Date1='BBB'
PS C:> $OutLine.Date2='BBB'
PS C:> $OutLines

Date1 : BBB
Date2 : BBB
Str1 :
Str2 :
Num_当年 :
Num_前年 :

投稿2017/02/08 08:04

編集2017/02/08 08:13
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

watan

2017/02/08 08:26

ありがとうございました。解決いたしました! 補足もありがとうございます。理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問