• ベストアンサー

Powershellでcsvから列を抽出しcsv

Windows10のPowershellについて教えてください。 コマンドライン上の1行で、CSVを入力して指定する複数の列を抽出し、CSVを作成したいです。行頭に列名はありません。 出力の際に、コンマ(,)は必要です。 例: 5列あるCSVから、2列目と4列目を抽出する 入力    ー>  出力 A,B,C,D,E     B,D F,G,H,J,K     G,J L,M,N,P,Q     M,P よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kteds
  • ベストアンサー率42% (1882/4440)
回答No.3

No.1です。 No.1では ヘッダーを名前で指定しましたが、配列 @(1..n) で指定すればいいです。 たとえば600列の場合は @(1..600) と指定します。 任意の列をselectするには列番号を指定します。 たとえば 1列と270列と275列目だけを抜き出すには select "1","270","275" と指定します。 No.1と同じファイルを使って、1列、2列、4列をselectする場合は次のようになります。 各ファイルは Fドライブにあるものとして、フルPATHで指定しています。 import-csv f:\csv-in.csv -header @(1..5) | select "1","2","4" | export-csv f:\csv-out.csv この結果、f:\csv-out.csv ファイルは以下のようになります。 #TYPE Selected.System.Management.Automation.PSCustomObject "1","2","4" "A","B","D" "F","G","J" "L","M","P" 余計な2行をskipして、ダブルクォーテーションをカットするには以下のようにします。 % は foreach のエイリアスです。 get-content f:\csv-out.csv | select -skip 2 | % {$_.Replace('"','')} | out-file f:\csv-result.csv この結果、f:\csv-result.csv ファイルは以下のようになります。 A,B,D F,G,J L,M,P 以上です。 上記の例ではダブルクォーテーションをカットするのに % {$_.Replace('"','')} を使用していますが、 powershell 7(添付画像) を使うとパラメータ指定でダブルクォーテーションをカットすることができます。

yamamoto2000
質問者

お礼

本当にありがとうございました。 さっそく活用させていただきます。

その他の回答 (2)

  • kteds
  • ベストアンサー率42% (1882/4440)
回答No.2

No.1の追記です。 出力ファイル csv-out.csv の上段2行をスキップする場合は次のように csv-skip2.csv に出力してみてください。 get-content csv-out.csv | select -skip 2 | out-file csv-skip2.csv csv-skip2.csvファイルは下記のようになります "B","D" "G","J" "M","P"

  • kteds
  • ベストアンサー率42% (1882/4440)
回答No.1

入力ファイル:csv-in.csv 出力ファイル:csv-out.csv であるものとします。 Powershell のimport-csvコマンドではオブジェクトの配列として扱いますので、 col1,col2,col3.col4.col5 のように列名を付けて扱います。 次のような一行のスクリプトになります。 import-csv csv-in.csv -header "col","col2","col3","col4","col5" | select col2,col4 | export-csv csv-out.csv 出力結果は次のようになります。 上段の2行はカットして使用してください。 #TYPE Selected.System.Management.Automation.PSCustomObject "col2","col4" "B","D" "G","J" "M","P"

yamamoto2000
質問者

補足

解説ありがとうございます。大変助かりました。 再度の質問です。 別のcsvですが、600列あります。Headerはありません。 その中から、1列と270列と275列目だけを抜き出して、再度、csvを出したいのですが、powershell で一行で記述することはできるでしょうか。

関連するQ&A