0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Powershell_CSV操作のtips

Last updated at Posted at 2025-03-18

背景

会社でのディレクトリ管理に困ってた時のTips
いろんなお客さんとのやり取りを、

  • みんなで1つのディレクトリ配下に格納しよう!
  • 命名規則もこうしてね!

みたいなお作法があった。これが不便。

例:
0001_A12345_<和名>
0002_B32899_<和名>
0003_Q77791_<和名>
※これが200個以上ある...

<ナンバー>_<顧客コード>_<顧客コードに対する和名>みたいな感じ。
これだと、目的の顧客コードがどの辺にあるのかスクロールして探していくのが、毎回億劫で...

要するに、
「顧客コードが先行して分かっているが、フォルダのナンバーは分からん」
なシチュエーションで困ってた。

なお現状、この顧客コードとナンバーの対応表が存在するのだが、それをわざわざ開いて検索して~の流れも手間なので、何か楽ちんなやり方無いかな~のTips

DNSチックにコマンドぽちーでレコード出せないかな?

という事で考えてみた。
顧客コードをPowershellに入力したら、ナンバー返してくれる結果を目指す!
といっても、会社PCにリゾルバをインストールして...てやるとセキュリティの管理も大変なので、標準機能だけで代替できる事考えてみた

結果

できました。全レコードのリストと、個別のリストを出すパターンですね。

PS C:\Users\USER> $source | format-table

num  name   flag  text
---  ----   ----  ----
0001 A12345 TRUE  Last Update by Tanaka
0002 B32899 FALSE Deleted
0003 Q77791 TRUE  Don't Edit


PS C:\Users\USER> $source | Where-Object {$_.name -match "A12345"}

num  name   flag text
---  ----   ---- ----
0001 A12345 TRUE Last Update by Tanaka

PS C:\Users\USER>

じつは事前に以下で変数を宣言しておく必要があります。

PS C:\Users\USER> $path = "$env:USERPROFILE\Documents\list.csv"
PS C:\Users\USER> $source = Import-Csv $path -Encoding UTF8

※今回のサンプルでは、documents配下にリストを配置しており、これを参照しております。リストのヘッダーとして後述の4要素を追加しております。

今後の話

実は、以下もPowershellからぽちっとcsv操作できるが、一旦次回にまわす。
・レコードを新しく追加する。
・レコードを編集する。
(CSV開いて追記すればいいじゃん は、一旦なしで)

後は備忘録です。

$path = "$env:USERPROFILE\Documents\list.csv"

これ、ダブルクォーテーションでくくらないとエラーが出ます。
後に打つコマンドによっては問題なく動作しますが

ヘッダーについて

$source = Import-Csv $path -Encoding UTF8
$headers = @("num","name","flag","text")
$record = New-Object psobject | Select-Object $headers
$var = @()

レコードを追加するときに、こんな感じで入れてます。

$source でリストをインポートして、$headers = @()でヘッダーを追加し、$recordにこの後値を登録していきます。
既存のファイルを操作するときは必要ないです。
また、$recordの中身は$varに入れてから最終的にエクスポート。

PS C:\Users\USER> $record."num" = "0001"
PS C:\Users\USER> $record."name" = "A12345"
PS C:\Users\USER> $record."flag" = "TRUE"
PS C:\Users\USER> $record."text" = "Last Update by Tanaka"
PS C:\Users\USER> $record

num  name   flag text
---  ----   ---- ----
0001 A12345 TRUE Last Update by Tanaka

こんな感じで登録されます。

次に$varの使い道ですが、

PS C:\Users\USER> $var += $record
PS C:\Users\USER> $var

num  name   flag text
---  ----   ---- ----
0001 A12345 TRUE Last Update by Tanaka

PS C:\Users\USER> $record = New-Object psobject | Select-Object $headers
*ここからはまた$recordに次の値を入れていく*

こうすれば、$recordにはまた次の値が上書きされますが、$varにデータは逃げているので問題ないです。

PS C:\Users\USER> $var

num  name   flag  text
---  ----   ----  ----
0001 A12345 TRUE  Last Update by Tanaka
0002 B32899 FALSE Deleted
0003 Q77791 TRUE  Don't Edit


PS C:\Users\USER> $var | export-csv -path $path -NoTypeInformation -Encoding UTF8 -append

最後に$varをもとのリストに追記すれば完了!

最後のオプション -append を付けないと、$varの値が上書きされ、いままでのデータが消えます。

-notypeinformationですが、これ無いと勝手にヘッダーが作成され、作ったヘッダーはレコードの1つのように扱われます。

最終的には.ps1のファイルにまとめたいですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?