フォルダー内の複数CSVを見出し1行でまとめる
同じ列のCSVをファイル名順に読み取り、1つのCSVへ縦にまとめます。入力と出力の分離、文字コード、列の順序確認、対象0件や既存ファイルがある場合の止め方まで説明します。
画面上の名前は、表示言語やバージョンによって異なる場合があります。Desktopの例は、フロー作成時に「Power Fx を有効にする」をオフにした標準構文です。Power Fx対応フローでは式・変数参照・インデックスの書き方が異なります。このページでは変数を %変数名% と表記します。出力変数の名前を入力する欄では、前後の % は付けません。
実行前に確認
- 必ずコピーした練習データから試します。OutputをInputの配下にせず、出力を次回の入力へ混ぜないでください。ファイル名の01、02は順序を安定させるためです。元のCSVはこの例では変更しません。
- 列名・順序・文字コードをそろえる例です。文字化けが出たら文字コードを確認し、Shift-JISなどが混在したまま実行しません。列名の空白も事前にそろえます。単純な文字列の連結ではなく、CSV用の読み書きアクションを使います。
- 列数が同じでも意味や順序が違えば誤集計につながります。マージのエラーモードだけで列の意味まで検証できると考えず、本文の列名確認を入れます。重複行の削除、数量の業務チェック、商品コードの先頭ゼロ保持を保証する処理は含みません。
- メモリ内で全行をまとめるため、まず小さなファイルで試します。書き込み中の障害に対する完全な巻き戻しや、並行実行時の上書き防止はありません。保存失敗時は出力の有無と内容を確認し、不完全な結果を利用しないでください。
- Windows上で本人が開始するローカルの練習です。インストール・サインイン・組織ポリシーと利用権を確認します。クラウドからの実行や無人実行は別の接続設定・ライセンスが必要になるため、この例の対象外です。
1使うアクション
- アクション 1ファイルが存在する場合出力先に同名ファイルがあれば、メッセージを表示してフローを停止
- アクション 2フォルダー内のファイルを取得Input内の*.csvを名前の昇順で取得。0件なら停止
- アクション 3新しいデータ テーブルを作成する地域・商品・数量の3列、データ行0件のAllRows
- アクション 4For eachFilesをCurrentFileとして順に処理
- アクション 5If → CSV ファイルから読み取る0バイトなら停止。それ以外は見出し付きでCurrentTableへ
- アクション 6If → データ テーブルをマージする列数・列名・順序が一致した表だけAllRowsに追加。不一致は停止
- アクション 7If → CSV ファイルに書き込むループの外側。全件成功してデータ行があればOutputへ1回だけ保存
図で見る処理のイメージ
概念図店舗別の売上CSV2個を1個にまとめる、架空の小さな練習データです。
入力を分離
Input:01_east.csv(2行)、02_west.csv(1行)。Outputにはまだファイルなし
一覧と空チェック
名前順に2個取得。0個なら停止。0バイトのファイルも読み取り前に停止
列を確認して追加
地域・商品・数量の順に一致する表だけAllRowsへ。不一致なら書き込み前に停止
最後に1回保存
Output/all_sales.csvへ、見出し1行とデータ3行を出力
地域,商品,数量 / 東,りんご,2 / 東,みかん,3 / 西,りんご,4 の4行になります。「/」はここでは改行を表します。列違い・入力0件・全て見出しのみの場合は出力しません。
架空の練習データによる説明です。実際のフローを実行して確認した結果ではありません。
設定と処理を説明する模式図です。実際の設定画面や実行結果のスクリーンショットではありません。
2実際の設定内容
入力する値・操作手順を確認する10ステップの設定と確認方法
- 1
準備:Power Automate for desktopで手動実行する練習です。Power Fxはオフにします。自分が読み書きできる場所に C:\PADPractice\Input と C:\PADPractice\Output を作成します。このパスを使えない場合は両方を自分の練習用フォルダーに置き換えます。Excelやクラウドサービスへの接続は使いません。
- 2
入力例:Inputに01_east.csvと02_west.csvをUTF-8(BOM付き)・カンマ区切りで用意します。どちらも1行目は「地域,商品,数量」。01_east.csvの2行目は「東,りんご,2」、3行目は「東,みかん,3」。02_west.csvの2行目は「西,りんご,4」です。引用符は実際には入れません。出力はOutputのall_sales.csvとし、最初は存在しない状態にします。
- 3
先頭に「ファイルが存在する場合」を置き、対象を C:\PADPractice\Output\all_sales.csv にします。存在する側には「メッセージを表示」(出力先に同名ファイルがあります)と「フローを停止」を配置します。以前の結果があれば、内容を確認してから別名へ退避し、改めて最初から実行します。
- 4
「フォルダー内のファイルを取得」:フォルダー=C:\PADPractice\Input、ファイルフィルター=*.csv、サブフォルダーを含める=オフ、並べ替え=名前、降順=オフ。生成変数をFilesにします。次にIfで %Files.Count% が0なら、メッセージ「対象CSVがありません」を表示して「フローを停止」。0件判定のEndの後に次の処理を置きます。
- 5
「新しいデータ テーブルを作成する」の編集画面で、列を左から地域・商品・数量とします。サンプルデータ行は入れず、データ行0件・列3個にし、生成変数をAllRowsにします。これは全ファイルの行をためる表です。
- 6
For eachの反復対象を %Files%、現在の項目をCurrentFileにします。ループ内の最初にIfで %CurrentFile.Size% が0なら、ファイル名 %CurrentFile.Name% をメッセージに含めて「フローを停止」。そのEndの後に「CSV ファイルから読み取る」を置き、パス=%CurrentFile.FullName%、エンコード=UTF-8、最初の行に列名が含まれている=オン、区切り記号=カンマ、生成変数=CurrentTableにします。
- 7
読み取った直後、「変数の設定」でColumnNamesに %CurrentTable.Columns% を代入します。Ifで %ColumnNames.Count% が3と等しくないなら、メッセージ「列数が違います:%CurrentFile.Name%」を表示して停止します。そのEndの後に、%ColumnNames[0]% が「地域」と等しくない、[1]が「商品」と等しくない、[2]が「数量」と等しくない、というIfを1個ずつ順に置き、それぞれ不一致側でメッセージを表示して停止します。列数を先に調べるので、存在しない列を参照しません。インデックスは0から始まります。
- 8
3つの列名確認のEndの後、まだFor eachの内側に「データ テーブルをマージする」(Merge data tables)を置きます。最初のテーブル=%AllRows%、2番目=%CurrentTable%、マージモード=余分な列でエラーが発生する。結果はAllRows自身に入ります。キーで横につなぐ「データ テーブルを結合する」(Join)ではありません。見出しだけの正常なCSVはデータ行0件なので、追加される行も0件です。
- 9
For eachのEndの後に、Ifで %AllRows.RowsCount% が0ならメッセージ「データ行がありません」を表示して停止します。そのEndの後に「CSV ファイルに書き込む」:変数=%AllRows%、パス=C:\PADPractice\Output\all_sales.csv、エンコード=UTF-8、列名を含める=オン、区切り記号=カンマ、ファイルが存在する場合=既存の内容を上書きする。先頭で既存ファイルを拒否し、ループ内では一度も書き込まない構成です。途中で別のフローや人が同名ファイルを作らない練習環境で実行します。
- 10
確認:正常例は見出し1行+データ3行で、東の2行の後に西の1行が並びます。Inputが空なら出力なし。列を「商品,地域,数量」に入れ替えたCSVなら保存前に停止します。0バイトのCSVは停止、見出しだけのCSVのみなら「データ行がありません」で停止します。既存の出力がある場合も最初に停止します。途中の読み取り・マージのエラーは無視して続行せず、既定の停止動作にします。
- 対象環境
- Power Automate for desktop(Windows・標準構文)
- 更新日
- 2026年10月7日