トップ回答者
データを参照して複数のファイルを作成したい

質問
-
皆様、はじめまして。
上記は例としてデータ2つ、作成したいファイルも2つですが、
Powershell初心者なので、どうかお知恵を頂きたいのですが。
以下の様なカンマ区切りの3行の参照データファイル(host.txt)が1つあります。
---------------
host01,1,11,21
host02,2,12,22
---------------
また、以下の様に記述されたファイル(conf.txt)があります。
---------------
aaa
bbb
ccc
ddd
---------------
host.txtを参照し、conf.txtを元にして、以下の様な2つのファイルを作成したいと思います。
内容はそれぞれ
ファイル名[conf01.txt]
(host.txtの1行目のデータが入る)
---------------
host01
1
11
21
---------------
ファイル名[conf02.txt]
(host.txtの2行目のデータ)
---------------
host02
2
12
22
---------------
本来実現したいのは、データ100(行)、ファイルも100あるので、Powershellでループ処理ができるとうれしいのですが。分かりづらくて申し訳ありませんが、
どうぞよろしくお願いします。
- 編集済み sumutaro 2014年6月11日 8:56
回答
-
こんにちは、
host.txtに項目名が付いていて、conf.txtで出力ファイルの項目の並びを設定したいというのであれば、以下のような感じでできそうです。
-- host.txt --
aaa,bbb,ccc,ddd
host01,1,11,21
host02,2,12,22--------------
-- conf.txt --
aaa
ddd
ccc
bbb--------------
$od = gc "d:\Desktop\conf.txt" Import-Csv "d:\Desktop\host.txt" | %{$no=1}{ $line = $_ $noStr=($no++).ToString("00") 0..($od.Count-1) | %{ $line.$($od[$_]) } | Out-File d:\Desktop\conf$noStr.txt }
-- conf01.txt --
host01
21
11
1-----------------
-- conf02.txt --
host02
22
12
2-----------------
やりたい事と違っていたらごめんなさい。
- 回答としてマーク sumutaro 2014年6月12日 11:53
すべての返信
-
こんにちは、
host.txtに項目名が付いていて、conf.txtで出力ファイルの項目の並びを設定したいというのであれば、以下のような感じでできそうです。
-- host.txt --
aaa,bbb,ccc,ddd
host01,1,11,21
host02,2,12,22--------------
-- conf.txt --
aaa
ddd
ccc
bbb--------------
$od = gc "d:\Desktop\conf.txt" Import-Csv "d:\Desktop\host.txt" | %{$no=1}{ $line = $_ $noStr=($no++).ToString("00") 0..($od.Count-1) | %{ $line.$($od[$_]) } | Out-File d:\Desktop\conf$noStr.txt }
-- conf01.txt --
host01
21
11
1-----------------
-- conf02.txt --
host02
22
12
2-----------------
やりたい事と違っていたらごめんなさい。
- 回答としてマーク sumutaro 2014年6月12日 11:53
-
こんにちは、
やりたいことと合っているのか良く判らなかったのでやっつけで書いてしまいました。
判り辛くてすいません。% は Foreach-Objectのエイリアス(別名)です。
Foreach-Object -Begin<初期処理用scriptblock> -Process<繰り返し用scriptblock> -End<後理用scriptblock>
といった記法になっていますが、省略して以下のようにも書けます。
Foreach-Object {初期処理用scriptblock}{繰り返し用scriptblock}{後処理用scriptblock}
初期処理や後処理は無ければ省略可能ですので通常はForeach-Object {繰り返し用scriptblock}として使われるケースが一般的。
今回は、%{初期処理用scriptblock}{繰り返し用scriptblock}として使っています。$noStr=($no++).ToString("00")
$noをカウントアップしつつ前ゼロを付けて$noStrに退避0..($od.Count-1) | %{
通常、1..9といった感じで書くと1から9までの配列を表します。
この場合、0からConfigの項目数分のループといった感じです。
C#とかで言うと、for(int i=0;i < $od.Count-1;i++)みたいな$line = $_
host.txtの1行分(のobject)を$lineに退避$line.$($od[$_])
$_ は0..($od.Count-1)の添え字が順に入ってきます。
$od[$_]で添え字に応じたconf.txtの行数の項目が参照できます。
$()で囲ってあるのは値の評価を強制するといった感じなのですが、とりあえずおまじないだと思っていただければ・・・。
結果としてここでは$line.aaaとか$line.bbbといった形で参照していることになります。
参考までに2行に分けて書くと
$abc = $od[$_]
$line.$abc
判らない部分があれば、また聞いてください。