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

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

ただいまの
回答率

87.90%

PowerShellで取り込んだCSVのパティング後のマッチング・文字列置換処理について

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 7,271

score 8

前提・実現したいこと

PowerShell(ver0.2)で、2つのcsvファイルを読み込み特定の列の値に対しそれぞれゼロ埋めとNULLの数値化を行い、その後、成型した値でマッチングを行い数値を文字列に置き換えてCSVファイルを出力するスクリプトを作っています。

・データ成型したい値の情報
値は1桁~3桁まであるので、すべて3桁にしたい
ex: 1 ⇒001 、10⇒010
※NULLの場合がある

<今問題なこと>

ゼロ埋め処理がうまく引き継がれていないのか、
その後のマッチング~置換・出力の前処理で下記のような結果になってしましいます。

もともと3桁の値 ⇒置換処理される
もともと1桁、2桁およびNULLの値 ⇒置換処理されない

どう組めばエラーなく、該当する全ての値を置換できるようになるかご教示ください。

発生している問題・エラーメッセージ

null 値の式ではメソッドを呼び出せません。
発生場所 行:6 文字:19
+  %{ $_.END.PadLeft <<<< (3,"0")}
    + CategoryInfo          : InvalidOperation: (PadLeft:String) []、RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull


インデックスの演算が失敗しました。配列のインデックスが null に評価されました。
発生場所 行:14 文字:19
+   %{$_.ID2 = $dic[ <<<< $_.ID2] ; $_} |
    + CategoryInfo          : InvalidOperation: (:) []、RuntimeException
    + FullyQualifiedErrorId : NullArrayIndex

該当のソースコード

Get-Content C:\work\INPUT_LIST.csv | ConvertFrom-Csv -Header ID,NAME,IP,HOST,HOST2 |
 %{ $_.ID.PadLeft(3,"0")}

Get-Content C:\work\INPUT.csv | ConvertFrom-Csv -Header No.,day,ID1,ID2 |
 %{ $_.ID1.PadLeft(3,"0")} |
 %{ $_.ID2.PadLeft(3,"0")}

 $dic = @{}
Get-Content C:\work\INPUT_LIST.csv | ConvertFrom-Csv -Header ID,NAME,IP,HOST,HOST2 |
  %{$dic[$_.ID] = $_.NAME}

Get-Content C:\work\INPUT.csv  | ConvertFrom-Csv -Header No.,day,ID1,ID2 |
  %{$_.ID1 = $dic[$_.ID1] ; $_}  |
  %{$_.ID2 = $dic[$_.ID2] ; $_} |
    Export-Csv C:\work\data\OUTPUTData.csv  -encoding Default

試したこと

ネットで調べましたが開発経験が浅く解決に至りませんでした。
事前処理結果をテンポラリに格納して、置換処理時に参照するような処理が必要なのでしょうか。

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

バージョン:2.0
実行環境:Winsows 7

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

START と END はどこから出てきましたか?

Get-Content C:\work\INPUT.csv | ConvertFrom-Csv -Header No.,day,ID1,ID2 |
 %{ $_.START.PadLeft(3,"0")} |
 %{ $_.END.PadLeft(3,"0")}

追記

たとえばこれを

Get-Content C:\work\INPUT.csv | ConvertFrom-Csv -Header No.,day,ID1,ID2 |
 %{ $_.ID1.PadLeft(3,"0")} |
 %{ $_.ID2.PadLeft(3,"0")}


こう変えるとお望みの動作になりますか?

Get-Content C:\work\INPUT.csv | ConvertFrom-Csv -Header No.,day,ID1,ID2 |
 Select-Object No., day, @{Name="ID1"; Expression={$_.ID1.PadLeft(3, "0")}}, @{Name="ID2"; Expression={$_.ID2.PadLeft(3, "0")}}

追記

これで試してみてください。

input.csv

1601,2016/08/04,001,001
1017,2016/08/04,002,025
1058,2016/08/04,103,001
1358,2016/08/04,500,002
0910,2016/08/04,500,""


input_list.csv

001,りんご支店
002,バナナ支店
025,キウイ支店
103,みかん支店
500,メロン支店


convert.ps1

$dic = @{}
Import-Csv .\input_list.csv -Header ID, Name |
    % {$dic[$_.ID] = $_.Name}
Import-Csv .\input.csv -Header No., day, ID1, ID2 |
    Select-Object No., day, @{Name="ID1"; Expression={$dic[$_.ID1.PadLeft(3, "0")]}}, @{Name="ID2"; Expression={$dic[$_.ID2.PadLeft(3, "0")]}} |
    Export-Csv .\OUTPUTData.csv -Encoding Default -NoTypeInformation -Force

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/05 11:58

    ありがとうございます。
    いただいたソースで実行すると、
    ・支店コードが1桁と2桁のものは置換できませんでした
    ・置換結果処理されたカラムの文字化けしていました。
    こちらは調べたところ、当方の環境がver02なので、Import-CSVでのEncodingに対応していないのが原因のようです。

    キャンセル

  • 2016/08/05 14:52

    そう言えば version 2.0 でしたね?
    こちらも 2.0 で試してみましたが、確かに Shift_JIS のものが文字化けしました。
    Import-Csv を、ご自分でされていたように Get-Content | ConvertForm-Csv にすれば文字化けしないことを確認しました。

    支店コードが 1 桁や 2 桁というのはどういうことでしょうか?
    input.csv の支店コードを 3 桁未満にしてみましたが、間違いなく動作しました。
    input_list.csv のことであれば、それは PadLeft を使っている以上当然の動作です。

    省略をこちらで補完しなければならないものではなく、私の挙げたように、実際に使えるデータとスクリプトを挙げてみてください。

    キャンセル

  • 2016/08/19 07:29

    どうなりましたか?

    キャンセル

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

  • ただいまの回答率 87.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る