【2023年】これからブログを始める人へおすすめの書籍

Kissy

PowerShellでCSVファイルを操作する方法まとめ!

作成: 更新:

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で指定するコードページの詳細が記載されています。

最後まで読んでいただきありがとうございます。
また読んでくださいませ。
そんじゃーね。

関連記事

SPONSORED LINK
SPONSORED LINK