none
PowerShellでVLOOKUP RRS feed

  • 質問

  • 二つのCSVファイルを読み込み、

    最初のファイルの一列目と二つ目のファイル一列目の値が同じだった場合、

    最初のファイルの二列目に二つ目のファイルの二列目の値を代入したいと思っています。

    ループで一行ずつ同じ値か判断する以外に、ExcelのVLOOKUPのような方法はありますでしょうか。

    2014年5月22日 7:50

回答

  • こんにちは、

    なぜかレスがつかないようですので参考までに連想配列を使った例を書いてみました。

    それぞれのCSVがこんな感じだったとして

    -- test1.csv --

    "no","team"
    "3"
    "4"
    "2"
    "3"
    "1"
    "6"

    -- test2.csv --

    "no","team"
    "1","巨人"
    "2","阪神"
    "3","中日"
    "4","ヤクルト"
    "5","広島"
    "6","横浜

    結果として以下の様なCSVを出力するには、

    -- 結果 test3.csv --

    "no","team"
    "3","中日"
    "4","ヤクルト"
    "2","阪神"
    "3","中日"
    "1","巨人"
    "6","横浜"

    $dic = @{}
    Import-Csv "D:\Desktop\test2.csv" -Encoding Default | 
      %{$dic[$_.no] = $_.team}
    Import-Csv "D:\Desktop\test1.csv" -Encoding Default |
      %{$_.team = $dic[$_.no ] ; $_} |
      Export-Csv  "D:\Desktop\test3.csv" -Encoding Default -NoTypeInformation

    • 回答としてマーク UltraKatan 2014年5月27日 0:11
    2014年5月24日 11:11
  • こんばんは、

    CSV1と2の中身を取り違えるとそのような結果になりそうですが、どうでしょうか?

    「%」についてはForEach-Objectのエイリアスでした。判り辛くてごめんなさい。

    • 回答としてマーク UltraKatan 2014年5月27日 0:11
    2014年5月26日 14:25

すべての返信

  • こんにちは、

    なぜかレスがつかないようですので参考までに連想配列を使った例を書いてみました。

    それぞれのCSVがこんな感じだったとして

    -- test1.csv --

    "no","team"
    "3"
    "4"
    "2"
    "3"
    "1"
    "6"

    -- test2.csv --

    "no","team"
    "1","巨人"
    "2","阪神"
    "3","中日"
    "4","ヤクルト"
    "5","広島"
    "6","横浜

    結果として以下の様なCSVを出力するには、

    -- 結果 test3.csv --

    "no","team"
    "3","中日"
    "4","ヤクルト"
    "2","阪神"
    "3","中日"
    "1","巨人"
    "6","横浜"

    $dic = @{}
    Import-Csv "D:\Desktop\test2.csv" -Encoding Default | 
      %{$dic[$_.no] = $_.team}
    Import-Csv "D:\Desktop\test1.csv" -Encoding Default |
      %{$_.team = $dic[$_.no ] ; $_} |
      Export-Csv  "D:\Desktop\test3.csv" -Encoding Default -NoTypeInformation

    • 回答としてマーク UltraKatan 2014年5月27日 0:11
    2014年5月24日 11:11
  • 回答ありがとうございます。

    早速試してみましたが、出力されたtest3.csvが下記のように記録されておりました。

    "no","team"
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",

    再現しないのは何が考えられますでしょうか。

    2014年5月26日 4:42
  • パイプラインの後の%{}ですが、この「%」はどのような意味を持つのでしょうか。

    ご教示いただければ幸いです。

    2014年5月26日 5:57
  • こんばんは、

    CSV1と2の中身を取り違えるとそのような結果になりそうですが、どうでしょうか?

    「%」についてはForEach-Objectのエイリアスでした。判り辛くてごめんなさい。

    • 回答としてマーク UltraKatan 2014年5月27日 0:11
    2014年5月26日 14:25
  • 元ファイルを入れ替えたら問題なく動作しました。

    また、%はForEach-Objectのエイリアスであると言う事も教えていただきありがとうございます。

    勉強になりました。

    解決とさせていただきます。

    2014年5月27日 0:11