• ベストアンサー

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% (1876/4424)
回答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% (1876/4424)
回答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% (1876/4424)
回答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

  • 巨大なCSVの加工(指定列のみの抽出)について

    巨大なCSVの加工(指定列のみの抽出)について 下記のような構成のCSVファイルがあります。 "ID","a","b","c","d","e","f","g","h","i","j","k","l","m" "0001","a","b","c","d","e","f","g","h","i","j","k","l","m" "0003","a","b","c","d","e","f","g","h","i","j","k","l","m" "0004","a","b","c","d","e","f","g","h","i","j","k","l","m" ・ ・ ・ 例えば、 ここから"ID"列と"c"列と"f"列のみ抽出して新たなCSVファイルで保存。 という処理を行いたいのですが、行数が5000万行近くあり、ファイルサイズが80GB程あるので エクセルはおろかアクセスでも開くことができません。 テキストエディタの秀丸64bit版なら開くことができますが、指定列の抽出方法が分かりません。 秀丸のマクロでもVBSでも良く、また膨大な待ち時間がかかっても構わないので実現する方法について お知恵をお貸しください。

  • powershellでcsvの順次読みこみ

    powershellでcsvの順次読みこみ powershellで下記のような事はできますか? <in_file.csv> a,1,A b,2,B c,3,C これを読み込み <out_file.csv> =1=《A》【a】 =2=《B》【b】 =3=《C》【c】 のように個別の項目を編集して出力

  • CSV出力について

    データベースから抽出したデータをカンマ区切りのCSVファイルにしたいと思います。 最終的に sCSVData = "りんご,みかん,オレンジ" のような形式です。 この場合、データにカンマが入ると列がずれてしまいます。 データをクオートすればいいのですが、 sCSVData = replace(sCSVData, ",", """,""") としたのですが、行頭と行末にカンマを入れれません。 どのようなコードを書けばよいのでしょうか。 ご教示よろしくお願いします。

  • PowershellでCSVをexcelに書き込む

    Powershellを使いCSVファイルをexcelの任意のセル位置から書き込むためにQueryTablesを使わない方法として下記コードをとあるサイトを見て継ぎ接ぎで作りましたがデータ量が多くなると処理時間を要します。 「QueryTablesよりStreamReaderのほうが 大容量(100MB以上)のテキストファイルを処理する場合、Get-ContentやImport-Csvなどのコマンドレットではなく、StreamReaderを使用することが推奨されています。なぜなら、PowerShellのパイプ処理は遅く、大量のメモリを消費するため、効率的な処理ができないからです。 StreamReaderは.NET Frameworkのオブジェクトを生成して使用するため、コードの記述量が増えるかもしれませんが、大容量ファイルの読み込みには最適な手法です。」 とありより良い方法と思いましたが私のコードのの書き方かどうか分かりませんが期待外れでした。因みに2列、1,000,001行でもQueryTablesなら15秒ぐらいですがこれだと10,001行で50秒位掛かりる状況でした。 # 通常のCSVファイルをExcelにインポートするスクリプト $excel = New-Object -ComObject Excel.Application $excel.Visible = $true $book = $excel.Workbooks.Add() $sheet = $excel.Worksheets.Item(1) $csvPath = "D:\test\pp004.csv" # CSV ファイルのエンコーディングを指定する $enc = [System.Text.Encoding]::UTF8 # CSV ファイルをオープンする $streamReader = New-Object -TypeName System.IO.StreamReader $csvPath, $enc # 変数を初期化する・・書き出し位置の指定 $i = 2 $j = 3 # 1行ずつ最終レコードまで読み込む While (($line = $streamReader.ReadLine()) -ne $null) { # カンマで文字列を分割し配列に格納する $fields = $line.Split(",") # 配列を順番に処理する foreach ($field in $fields) { # セルの書式を「文字列」にする #$sheet.Cells.Item($i, $j).NumberFormat = "@" # セルに値を設定する $sheet.Cells.Item($i, $j).Value = $field # 列を1つ進める $j++ } # 行を1つ進める $i++ # 変数初期化 $j = 3 } # CSV ファイルを閉じる $streamReader.Close() # COM 参照を解放する [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($sheet) [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($book) [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) [GC]::Collect() もしこのコードに問題があればお教えください。 よろしくお願いします。

  • 文字列の抽出について

    A列に 500行位の文字列があり、 その行の中から以下を抽出したいです。 ただ、抽出したい文字列は、0123456で始まり、abcdという文字列まで。 しかも改行されています。 ※抽出したい文字列 【A列 0123456 ~ B列 abcd】という文字列 【F列 0123456 ~ B列 abcd】という文字列 A列 0123456 B列 xxxx abcd C列 1111 D列 2222 E列 3333 F列 0123456 G列 xxxx abcd H列 4444 I列 5555 J列 6666 宜しくお願い致します。

  • 複雑なcsv

    以下のような2つの入力データをデータベースに格納する作業を行っております.2つのデータは,"b"の値によって判別が可能です. 入力データ(スペースをカンマで表現しています): 1 a,b,c - [d,e,[f:g,h:i],[j,[k:m,n:o]]] (p) 2 a,b,c - d:e, f:g この2つのデータをなるべく簡単に処理するにはどのようにすればよろしいでしょうか.私が書いた(ている)コードでは,splitで地道に展開しているのですが,あまりにも要領が悪いかんじです. 簡単なコードを示していただけると嬉しいです.

    • ベストアンサー
    • PHP
  • エクセルVBAで複数CSVを抽出、ブックへの出力

    エクセルVBAで複数のCSVファイルからファイル名と 任意のセル8箇所を自作した計算シートに抽出。 別ブックにCSVファイル名 計算結果4種類を出力する。 というvbaを作りたいのですがどうすればよいでしょうか? CSVファイルが1700ほどあり、大変困っています。 申し訳ありませんがご教授願います。 ーーーーーーーーーーーーーーーーーーーーーーーーーーー 詳細 CSV読み込みセル8箇所:B2、D2、F2~P2 自作計算シートへの貼り付け箇所:G3~G10 計算結果セル抽出箇所:C8~F4 出力の理想系は CSVファイル名、計算結果1、2、3、 4の順で file01 ○○ ○○ ○○ ○○ file02 ○○ ○○ ○○ ○○ ・・・ ・・ のようになれば大変嬉しいです。 お力をお貸しください よろしくお願いいたします。

  • エクセルで特定の列だけを抽出してcsvで保存したい

    エクセルで特定の列だけを抽出してcsvで保存したい 例えば、A列:住所、B列:氏名、C列:電話番号といった3つの列がありそれぞれデータがはいっているとします(図参照)。 そしてcsvとして書き出すときにB列とC列だけを書き出したい場合どのようにすればよいでしょうか。 この場合、書き出すときにA列だけを一旦削除、などということはしたくないです。 また1列目のタイトルも書き出さないようにしたいです。 ご教授よろしくお願いいたします。

  • csvファイルを開かずに文字を検索し行を抽出したい

    フォルダの中に複数のCSVファイルが有ります。 これらのファイルを開かずに文字列を検索し、検索対象の文字と完全一致する 文字がある行をまとめてひとつのファイルに抽出する方法を探しています。 例:Aフォルダ内にファイル1、ファイル2、ファイル3、、、と複数のファイルがある。 ファイルのフォーマットはすべてCSV。ファイルにはシートは一つのみ。日付なのですべて異なります。       A         B  C   D   E   F  G   H   I   J  K   L 加工年月日時分 品種 コード A列 B列 C列 D列 E列 F列 G列 本数 作業者    ・    ・    ・ A~Lまであり、Cのコードが指定した検索文字と完全一致するものを抽出したいです。 急ぎの内容の為、VBAやコマンドプロンプトなど、自分なりに色々なサイトにある プログラムを組み換えようとしましたが初心者の為すぐに理解して応用はとても 無理でした。知恵を貸して頂きたいです。

  • C言語でのCSVソートとデータ抽出について

    皆様、はじめまして。 この度、急ぎでプログラムをC言語で作成するように命じられました。 C言語は経験が無いと断ったのですが、要員確保が出来ない為、何とかしてくれとのこと。 本来なら自分で学習しながら、作成すべきなのですが、超短納期の為、その時間が取れません。 今回は誠に申し訳ないのですが、皆様のお力をお借り出来ないでしょうか。 宜しくお願いいたします。 仕様概要 ・CSVファイルを読み込み、2カラム目の項目(文字型)で昇順ソート(qsort)を行う。 ・ソートされた2カラム目の同一値毎に1カラム目(数値型)が最大値となるレコードを抽出する。 ・抽出されたレコードを新規CSVファイルに出力する。 入力CSV概要 ・レコード件数は日によって変わる ・カラム数は8つ ・各カラムの項目長は可変長 ・上記に伴いレコード長も可変長 入力ファイル例 39,"AAA3","B1","C1","D1","E1","F1","G1" 100,"AAA1","B2","C2","D2","E2","F2","G2" 101,"AAA2","B3","C3","D3","E3","F3","G3" 105,"AAA1","B4","C4","D4","E4","F4","G4" 102,"AA1","B5","C5","D5","E5","F5","G5" 99,"AAA2","B6","C6","D6","E6","F6","G6" 1019,"AAA3","B7","C7","D7","E7","F7","G7" 処理後に出力されるファイル 102,"AA1","B5","C5","D5","E5","F5","G5" 105,"AAA1","B4","C4","D4","E4","F4","G4" 101,"AAA2","B3","C3","D3","E3","F3","G3" 1019,"AAA3","B7","C7","D7","E7","F7","G7"