PowerShellでCSVファイルを操作する方法まとめ!
PowerShellでCSVファイルを操作する方法を記載します。
サンプルCSVファイル
この記事で使用するサンプルCSVファイル(testdata.csv)です。
商品のデータで、商品番号(No)、画像URL(Url)、色(Color)、サイズ(Size)のデータがあるものとします。
No,Url,Color,Size
00001,https://hoge/1-Red-L.png,Red,L
00001,https://hoge/1-Blue-M.png,Blue,M
00001,https://hoge/1-Yellow-S.png,Yellow,S
00002,https://hoge/2.png,Yellow,L
00003,https://hoge/3.png,Yellow,L
00004,https://hoge/4.png,Yellow,L
00005,https://hoge/5.png-Yellow-L,Yellow,L
00005,https://hoge/5.png-Yellow-M,Yellow,M
00005,https://hoge/5.png-Blue-L,Blue,L
CSVを読み込む方法
CSVファイルを読み込むには、Import-Csv
コマンドレッドを使用します。
$products = Import-Csv testdata.csv
ただし、CSVファイルの形式によっては読み込み時に少し工夫が必要になる場合があります。
文字コードを指定する場合
CSVファイルの文字コードがUnicode以外のエンコードになっている場合は、明示的に文字コードを指定する必要があります。
たとえば、Shift-JISならDefaultを指定します。
$products = Import-Csv testdata.csv -Encoding Default
Shift-JIS以外のエンコードを指定する場合は、以下を指定します。
-Encoding | オプション値 |
---|---|
ASCII | ASCII(7bit) |
BigEndianUnicode | UTF-16(ビッグエンディアン) |
OEM | MS-DOSやコンソールプログラムのデフォルトエンコード |
Unicode | UTF-16(リトルエンディアン) |
UTF7 | UTF-7 |
UTF8 | UTF-8 |
UTF8BOM | UTF-8(BOMあり) |
UTF8NoBOM | UTF-8(BOMなし) |
UTF32 | UTF-32 |
また、PowerShell 6.2以降はコードページの数値ID(1251など)や文字列名("windows-1251"など)での指定も可能になっています。詳細はEncoding.CodePageを参照ください。
ヘッダ行がない場合
CSVファイルには一行目にヘッダ行がある必要があります。
ヘッダ行とは、カンマで区切られたそれぞれの値の名前が書かれた行です。PowerShellで読み込んだCSVのデータを参照する際に、ヘッダ行の名前をキーとして値を参照します。
もしヘッダ行がない場合は、-Header
でヘッダ行を明示的に指定する必要があります。
$products = Import-Csv testdata.csv -Header "No","Url","Color","Size"
区切りがカンマ,
でない場合
CSVファイルの中には、区切り文字がカンマ,
ではない場合があります。(例えばタブ文字など)
そういった場合は、-Delimiter
で明示的に区切り文字を指定する必要があります。タブの場合は以下のようになります。
$products = Import-Csv testdata.csv -Delimiter `t
CSVのデータを参照する
次に読み込んだCSVファイルの値を参照する方法です。
Import-Csv
でCSVファイルを読み込むと、オブジェクトを返します。このオブジェクトは配列のように扱え、1つの要素がCSVのデータの1行になります。
例えば、2行目(データとしては1つ目)のデータのURLを参照する場合は、以下のようになります。
$products = Import-Csv testdata.csv
$products[0].Url
参照するデータは、ヘッダーの名前で指定します。この例では、Url
を参照しています。
CSVを一行ずつ繰り返し操作する
Import-Csv
の返すオブジェクトはコレクションなので、foreach
文やForEach-Object
コマンドレッドで繰り返し処理ができます。
$products = Import-Csv testdata.csv
foreach ($product in $products)
{
$product.No
}
この例では、すべてのCSVデータのNoを表示しています。
CSVの重複を排除して処理する
サンプルCSVファイルでは、NoもColorも重複があります。これを、NoとColorの組み合わせで重複が無いようにフィルターをかけて処理したい場合、以下のようになります。
# CSVファイルからプロパティ(NoとColorの組み合わせ)の重複を削除
$products = $allProducts | Sort-Object -Property No,Color -Unique
foreach ($product in $products)
{
$product.Url
}
参照サイト
- Encoding.CodePage
Encoding
で指定するコードページの詳細が記載されています。
最後まで読んでいただきありがとうございます。
また読んでくださいませ。
そんじゃーね。