ゴールのイメージをそろえる
今回のテーマは「フォルダの中にいろんな種類のファイル(.csv, .xlsx, .txt など)が混ざっていても、“拡張子ごとに取込を制御できる実務テンプレ”を身につけること」です。
やりたいことは、たとえばこんな感じです。
「このクエリでは .csv だけ読みたい」「.xlsx と .xlsm は OK だけど .xls は無視したい」「.txt は別クエリで処理したい」など。
キーワードは Folder.Files と [Extension] 列、そして Table.SelectRows です。
ここを押さえると、「拡張子別に取込制御」はほぼパターンで書けるようになります。
基本の仕組み:Folder.Files と Extension 列
フォルダを「ファイル一覧の表」に変える
まず、フォルダ一括取込の入口はいつも Folder.Files です。
let
Source = Folder.Files("C:\Data\Import")
in
Source
Power Queryこれを実行すると、「そのフォルダにあるファイルの一覧」がテーブルとして返ってきます。
このテーブルには、次のような列が含まれます。
Name(ファイル名)
Extension(拡張子。例:”.csv” “.xlsx”)
Folder Path(フォルダのパス)
Date modified(更新日時)
Size(サイズ)
Content(中身のバイナリ)
今回の主役は [Extension] 列です。
ここを条件にして、「どの拡張子のファイルを取り込むか」を制御していきます。
拡張子は「.csv」「.xlsx」のようにドット付きで入っている
初心者が最初にハマりやすいポイントがここです。
Extension 列には "csv" ではなく ".csv" のように「ドット付き」で入っています。
なので、条件を書くときは
[Extension] = ".csv"
Power Queryのように書く必要があります。
ここを "csv" と書いてしまうと、いつまでもヒットせず「なんでだ…」となりがちなので、覚えておいてください。
例題1:.csv だけを取り込むテンプレ
一番よく使う「単一拡張子フィルタ」
フォルダに .csv と .xlsx が混ざっているけれど、「このクエリでは .csv だけを読みたい」というケースからいきます。
let
Source = Folder.Files("C:\Data\Import"),
// 拡張子が .csv のものだけに絞り込む
OnlyCsv =
Table.SelectRows(
Source,
each Text.Lower([Extension]) = ".csv"
)
in
OnlyCsv
Power Queryここでのポイントは二つです。
Table.SelectRows で「行を絞り込んでいる」こと。Text.Lower([Extension]) として「小文字にそろえてから比較している」こと。
Extension 列は環境によっては「.CSV」のように大文字で入ることもあります。Text.Lower で小文字にそろえておけば、.csv と .CSV の両方を同じように扱えます。
この OnlyCsv をベースにして、Csv.Document でテーブル化していくのが、CSV 一括取込の定番パターンです。
例題2:.xlsx と .xlsm は OK、.xls は除外するテンプレ
「似た拡張子をグループで扱う」パターン
実務では、「新しい形式(.xlsx, .xlsm)は取り込み対象だけど、古い .xls は対象外にしたい」ということもよくあります。
その場合は、or(または)を使って複数条件を書くか、List.Contains を使って「許可リスト」を作るか、のどちらかです。
or を使った素直な書き方
let
Source = Folder.Files("C:\Data\Excel"),
OnlyNewExcel =
Table.SelectRows(
Source,
each
let
ext = Text.Lower([Extension])
in
ext = ".xlsx" or ext = ".xlsm"
)
in
OnlyNewExcel
Power Queryext という変数に一度だけ小文字化した拡張子を入れておき、
それが “.xlsx” か “.xlsm” のどちらかなら残す、という書き方です。
List.Contains を使った「許可リスト」パターン
拡張子の種類が増えてきたら、List.Contains の方がスッキリ書けます。
let
Source = Folder.Files("C:\Data\Excel"),
AllowedExtensions = {".xlsx", ".xlsm"},
OnlyAllowed =
Table.SelectRows(
Source,
each
List.Contains(
AllowedExtensions,
Text.Lower([Extension])
)
)
in
OnlyAllowed
Power Queryここでは、AllowedExtensions というリストに「許可する拡張子」をまとめておき、List.Contains で「この拡張子は許可リストに含まれているか?」を判定しています。
この書き方の良いところは、「あとから拡張子を追加・削除しやすい」ことです。.xlsb も許可したくなったら、AllowedExtensions に ".xlsb" を足すだけで済みます。
例題3:拡張子ごとに処理を変える(CSV と Excel を同じフォルダで管理)
想定する状況
同じフォルダに、システム出力の CSV と、手入力の Excel が混ざっているとします。
C:\Data\Mixed
売上_2024-10.csv
売上2024-11.csv
マスタ商品.xlsx
「売上*.csv は明細として結合したい」「マスタ商品.xlsx は別クエリで参照したい」
というように、拡張子だけでなく「ファイル名のパターン」も絡めて制御したいケースです。
CSV 用クエリ:.csv だけを取り込む
let
Source = Folder.Files("C:\Data\Mixed"),
OnlyCsv =
Table.SelectRows(
Source,
each Text.Lower([Extension]) = ".csv"
)
in
OnlyCsv
Power Queryここから先は、前にやった「フォルダ内 CSV 一括取込」のテンプレにそのままつなげればOKです。
Excel 用クエリ:.xlsx だけを取り込む
let
Source = Folder.Files("C:\Data\Mixed"),
OnlyXlsx =
Table.SelectRows(
Source,
each Text.Lower([Extension]) = ".xlsx"
)
in
OnlyXlsx
Power Queryこのクエリをベースにして、「特定シート名だけ読む」「1枚目シートだけ読む」などのテンプレを組み合わせます。
一つのクエリの中で「拡張子ごとに処理を変える」こともできる
もう少し発展形として、「同じクエリの中で、拡張子によって処理を変える」こともできます。
たとえば、こんなイメージです。
let
Source = Folder.Files("C:\Data\Mixed"),
WithTable =
Table.AddColumn(
Source,
"DataTable",
each
let
ext = Text.Lower([Extension])
in
if ext = ".csv" then
Csv.Document(
[Content],
[
Delimiter = ",",
Encoding = 65001,
QuoteStyle = QuoteStyle.Csv
]
)
else if ext = ".xlsx" then
let
wb = Excel.Workbook([Content], true, true),
firstSheetRow =
Table.SelectRows(wb, each [Kind] = "Sheet"){0},
firstSheetTable = firstSheetRow[Data]
in
firstSheetTable
else
null,
type any
)
in
WithTable
Power Queryここでは、拡張子が .csv のときは Csv.Document、.xlsx のときは Excel.Workbook、
それ以外は null を返す、という分岐をしています。
このあとで「DataTable が null の行を除外」すれば、
CSV と Excel を同じクエリの中で処理しつつ、不要な拡張子は自動でスキップできます。
重要ポイントの深掘り
Text.Lower を必ずかませる理由
Extension 列は、環境や取得元によっては
.csv.CSV.Csv
のように大文字・小文字が混ざることがあります。
M 言語の比較は基本的に「大文字小文字を区別する」ので、[Extension] = ".csv" と書くと .CSV はヒットしません。
そこで、
Text.Lower([Extension]) = ".csv"
Power Queryのように、「比較前に小文字にそろえる」のが実務テンプレです。
これを癖にしておくと、「環境が変わったら急にヒットしなくなった」という事故を防げます。
拡張子で「取り込まないもの」を明確に決める
フォルダ一括取込をするときに大事なのは、「何を読むか」だけでなく「何を読まないか」を決めることです。
たとえば、こんなものは対象外にしたいことが多いです。
バックアップファイル(.bak, .tmp など)
古い Excel 形式(.xls)
ログファイル(.log)
これらを Extension で明確に除外しておくと、
「変なファイルが混ざってクエリが壊れる」リスクをかなり減らせます。
さっきの AllowedExtensions リストを使うパターンは、
「許可したもの以外は全部無視する」という設計にしやすいので、実務的にとても強いです。
実務テンプレとしてのまとめ
拡張子別に取込制御する型は、こう整理できます。
フォルダを Folder.Files で「ファイル一覧テーブル」にする。
Extension 列を Text.Lower で小文字にそろえたうえで、Table.SelectRows で欲しい拡張子だけに絞る。
複数拡張子を扱うときは、or か List.Contains で「許可リスト」を作る。
必要なら、拡張子ごとに処理を分岐させる(if ext = … then …)。
一度この型を体に入れてしまえば、
「このフォルダ、いろんなファイルが混ざっててイヤなんだよね」という状況でも、
落ち着いて「何を読むか」「何を読まないか」をコードで表現できるようになります。
