none
データを参照して複数のファイルを作成したい RRS feed

  • 質問

  • 皆様、はじめまして。
    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
    ---------------

    上記は例としてデータ2つ、作成したいファイルも2つですが、
    本来実現したいのは、データ100(行)、ファイルも100あるので、Powershellでループ処理ができるとうれしいのですが。

    分かりづらくて申し訳ありませんが、
    どうぞよろしくお願いします。



    • 編集済み sumutaro 2014年6月11日 8:56
    2014年6月11日 8:36

回答

  • こんにちは、

    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
    2014年6月12日 8:58

すべての返信

  • conf.txtがどのように使われているのか、この例では判断できないように思います。
    2014年6月11日 9:46
    モデレータ

  • 牟田口様

    説明が足らなくてすみません。

    conf.txt内のaaa,bbb,ccc,dddをそれぞれ変数として
    下記の様に対応させたいのです。

    ファイル名[conf01.txt]
    aaa←host01
    bbb←1
    ccc←11
    ddd←21

    ファイル名[conf02.txt]
    aaa←host02
    bbb←2
    ccc←12
    ddd←22

    ご質問の回答になっているでしょうか。
    2014年6月12日 5:22
  • こんにちは、

    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
    2014年6月12日 8:58
  • minminnana_prof様

    ご回答有難うございます。
    やりたいこと、です!!
    ご回答いただいた上に、大変恐縮なのですが、
    今後の為に、簡単でよいのでスクリプトについて
    コメントいただくことは可能でしょうか。

    特に2行目のパイプラインから6行目までなのですが。

     | %{$no=1}{
    	$line = $_
    	$noStr=($no++).ToString("00")
    	0..($od.Count-1) | %{
    		$line.$($od[$_])  

    宜しくお願いします。

    2014年6月12日 11:52
  • こんにちは、
    やりたいことと合っているのか良く判らなかったのでやっつけで書いてしまいました。
    判り辛くてすいません。

    % は 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

    判らない部分があれば、また聞いてください。

    2014年6月14日 3:35
  • minminnana_prof様

    返信が遅くなりました。
    申し訳ありません。

    ご丁寧な説明をいただき感謝です。
    参考にさせていただき、勉強してみます。
    有難うございました。
    また宜しくお願いします。
    2014年6月16日 8:40