質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

6436閲覧

PowerShellによるcsvの要素集計

tkdm

総合スコア3

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2021/11/27 08:16

Powershellで読み込んだcsvの特定列の項目の合致する値の個数を集計したいです。
Excelのピボット作業をPowershellでcsvを加工する間に一緒にしてしまえればと思ったのですが、csvの内容をソートして上書き等は出来たのですが、特定ワードを指定してそれがいくつ(何行)あるかカウントするような事は出来るのでしょうか。
データ的には、
日付,内線,発信
2021/11/11,100,117
2021/11/11,200,117
2021/11/11,100,117
2021/11/11,300,117

上記のようになっているcsvで、その日の内に内線がいくつ発生しているのかを集計したいです。
excelでピボットする場合では、
内線
100 2
200 1
300 1

といった風にするので、対象の内線毎のバッチを作成して要素数を数えた結果をcsvで出力して最後に結果を一つのcsvに結合して・・・といった風にすれば実現は出来るのですが、内線をいちいち指定しなければいけない為、出来れば読み込んだcsv内の内線がそれぞれいくつあるかの結果を出力するようにしたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のような感じでどうでしょうか?(StackOverflow に似たような質問があったの真似て書いてみました。)

■ count.ps1

PowerShell

1Import-Csv ".\log.csv"| 2Group-Object 日付,内線| 3Select-Object @{Name='内線';Expression={$_.Values[1]}}, 4 @{Name='回数';Expression={ 5 ($_.Group|Measure-Object 発信 -Sum).Count 6 }}

■ 実行結果

PS C:\home\edu\teratail\questions\371230> .\count.ps1 内線 回数 ---- ---- 100 2 200 1 300 1

<参考>
■ Powershell Group Object in CSV and exporting it
https://stackoverflow.com/questions/28765038/powershell-group-object-in-csv-and-exporting-it

投稿2021/11/27 10:23

編集2021/11/27 10:36
cx20

総合スコア4648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/11/27 10:30

日付、内線は内線、回数の間違いですよね?
cx20

2021/11/27 10:36

Zuishin さん、ご指摘ありがとうございます。 出力項目に誤りがありました。失礼しました。
tkdm

2021/11/29 02:00 編集

コピペして実行させてみたのですが、集計が出来ませんでした。 実際にあてたいlog用に書き直してもみたのですが、同じように内線空白、回数0になってしまいました。 powershellの理解度が低い為読み解けないのですが、グループ化して結果表示する列を選ぶ、内線の値を抽出する、回数へ発信が発生した回数を入れる、といった動きのイメージでよいでしょうか。 PS C:\Users\t\desktop> .\test.ps1 内線 回数 ---- ----    0
cx20

2021/11/29 02:59

文字コードの関係かと思います。CSVをUTF-8に変えて試して頂けますか?
tkdm

2021/11/29 07:39 編集

ご返信ありがとうございます。 文字コードは最初にUTF-8で行って文字化けした為ANSIに変更していました。 csvとスクリプトファイルをそれぞれUTF-8に変更すると回数は集計出来るようになりましたが、内線が表示されませんでした。 PS C:\Users\t160.TAK-DOM\desktop> .\test.ps1 nai kai --- ---    2    1    1 Powershellが文字コード周りで上手くいかなかったのは今回処理させたいCSVの出力の段階から何度も躓いているのですが、この時点で-Encoding Defaultと指定してShift_JISになってしまっているようです。 文字コード周りは変更を行って動作するのかはテストしているのですが、イマイチ何がどれなら動作する、という事を理解出来ていません。 この処理を含めた一連の動きは、 随時集計のlog.txt log.txtから日時のデータをcsvで出力するバッチ バッチ内処理が出来ない内容をさせる為にバッチから叩くスクリプト となっていますが、このバッチファイルとスクリプトをタスクスケジューラから実行する際に文字コードをいじっています。Powershell側の文字コード指定等で改善するのでしょうか?
cx20

2021/11/29 15:59

自分が試した際の文字コードとしては、 ・CSV ファイル … UTF-8 ・ps1ファイル … Shift_JIS でした。(自分もそれほど PowerShell に詳しいわけでは無いので、PowerShell の文字コード事情は調べないと何とも、といった感じです。。)
tkdm

2021/12/01 02:50

csvをテキストファイルを新規作成→手打ちで内容入力→UTF-8で保存→拡張子をcsvに変更 これで上記Powershellコマンドを実行したら集計出来ました。 恐らくCSVをエクセルで開いた状態で保存したのが悪さしたのかもしれないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問