ドイツやフランスなど、欧州のシステムから出力されたCSVでは、小数点にカンマ、桁区切りにピリオドやスペースを使うことがよくあります。たとえば「1.234,56」は、日本の書き方では「1,234.56」です。
日本語環境のPower Queryで、この値を日本の書き方のルールで数値にしようとすると、うまくいきません。エラーになるか、文字列のまま残るか、エラーは出ないのに桁の違う数値になるかのどれかが起きます。最後のケースは見落としやすいので特に注意が必要です。
この記事では、元データの国の書き方(ロケール)を指定して正しい数値に変換し、変換後に件数と合計で確かめるまでの手順を説明します。
何が起きているのか
文字列を数値に変換するとき、Power Queryはロケール(カルチャ)に合わせて「どの記号が小数点で、どれが桁区切りか」を判断します。ロケールを指定しない型の変換は、ブックやPCの地域設定に従います。日本語の設定では、ピリオドが小数点、カンマが桁区切りとして扱われます。
| CSV上の表記 | 本来の値 | 日本語の設定で変換したときに起きうること |
|---|---|---|
1.234,56 |
1234.56 | エラーになる、または違う値になる |
12,5 |
12.5 | カンマが桁区切りとみなされ、125 になることがある |
0,75 |
0.75 | 75 になることがある |
1 234,56 |
1234.56 | スペースを含むためエラーになる |
合計が本来の10倍・100倍・1000倍になっていたら、この取り違えを疑ってください。
手順1:自動で追加された「変更された型」ステップを確認する
「テキスト/CSVから」で取り込むと、「適用したステップ」に「変更された型」が自動で追加されることがあります。このステップはロケールを指定せずに型を決めているので、この段階ですでに数値が誤って変換されている可能性があります。
- 「適用したステップ」で、ヘッダー昇格の直後のステップを選びます。
- 数式バーに
Table.TransformColumnTypesがあり、末尾にロケールの指定("de-DE"など)がなければ、それが自動の型変更です。 - このステップを削除し、対象の列が文字列(列見出しに「ABC」のアイコン)で、値が「1.234,56」のように元の表記のまま見えることを確認します。
このステップを削除すると、ほかの列の型もすべて未設定に戻ります。ほかの列の型は、手順2のあとに改めて設定してください。
毎回この自動ステップが付くのを避けたい場合は、「ファイル」→「オプションと設定」→「クエリオプション」に、型を自動で検出するかどうかの設定があります。項目名はバージョンによって違うため、画面で確認してください。
手順2:「ロケールを使用」で型を変更する
- カンマ小数になっている列を選びます(Ctrlキーで複数選べます)。
- 列見出しを右クリックし、「型の変更」→「ロケールを使用...」を選びます。
- データ型は「10進数」を選びます。
- ロケールには、元のデータを出力した国の書き方を選びます(例:ドイツ語(ドイツ))。
- 「OK」を押し、数式バーを確認します。
数式バーには次のような式が入ります。末尾の "de-DE" が、ロケールの指定です。
= Table.TransformColumnTypes(昇格されたヘッダー数, {{"Betrag", type number}}, "de-DE")
どのロケールを選ぶか
国によって、小数点と桁区切りの組み合わせが違います。国名から推測するのではなく、CSVの値を何行か見て、どの記号が小数点として使われているかを確かめてから選んでください。
- 「1.234,56」のように、ピリオドが桁区切りでカンマが小数点:ドイツ語(ドイツ)など
- 「1 234,56」のように、スペースが桁区切りでカンマが小数点:フランス語(フランス)など
判断に迷うときは、データの提供元に「小数点と桁区切りに何を使っているか」を確認するのが確実です。同じファイルの中で、列によって書き方が違うこともあります。その場合は、列ごとに別々のロケールで変換します。
日付の列も同じ考え方で直す
同じCSVでは、日付が「31.12.2025」のような日・月・年の順になっていることもよくあります。日付の列も、データ型を「日付」にして同じロケールを指定すると、正しい日付として変換できます。
Mで書く場合
詳細エディターで書くなら、元の値を控える列を作ってから変換すると、あとで変換前と変換後を見比べられます。
let
ソース = Csv.Document(File.Contents("C:\データ\sales_de.csv"), [Delimiter = ";", Encoding = 65001, QuoteStyle = QuoteStyle.Csv]),
見出し昇格 = Table.PromoteHeaders(ソース, [PromoteAllScalars = true]),
元の値を控える = Table.DuplicateColumn(見出し昇格, "Betrag", "Betrag_元"),
ロケールで型変更 = Table.TransformColumnTypes(
元の値を控える,
{{"Betrag", type number}, {"Datum", type date}},
"de-DE"
)
in
ロケールで型変更
カスタム列で1列だけ変換したい場合は、Number.FromText にロケールを渡します。
= Number.FromText([Betrag], "de-DE")
スペース区切りでエラーが残る場合
桁区切りにスペースを使うデータでは、普通のスペースではなく、改行されないスペース(ノーブレークスペース)が使われていることがあります。ロケールを指定してもエラーが残るときは、変換の前にスペース類を取り除いてから、ロケールを指定して変換します。
空白除去 = Table.TransformColumns(
見出し昇格,
{{"Montant", each Text.Remove(_, {" ", "#(00A0)", "#(202F)"}), type text}}
)
マイナスの値が「-12,50」ではなく「12,50-」や「(12,50)」のように書かれている場合は、ロケールを指定しても数値にならないことがあります。エラーになった行の元の値を見て、表記を確かめてください。
手順3:変換後に件数と合計を突き合わせる
エラーが表示されないことは、正しく変換できた証拠になりません。次の3つを確認します。
1. エラーの件数を見る
「表示」タブの「列の品質」をオンにすると、列ごとに「有効」「エラー」「空」の割合が表示されます。既定では先頭1000行だけを対象に集計しているので、ステータスバーの表示を「データセット全体に基づく列のプロファイル」に切り替えてから確認してください。
2. 行数と合計をチェック用のクエリで出す
変換後のクエリ(例:「売上データ」)を参照して、行数・エラーのある行の数・合計を1か所に出します。
let
データ = 売上データ,
行数 = Table.RowCount(データ),
エラー行数 = Table.RowCount(Table.SelectRowsWithErrors(データ, {"Betrag"})),
合計 = List.Sum(データ[Betrag])
in
[行数 = 行数, エラー行数 = エラー行数, 合計 = 合計]
エラーの行が残っていると、合計もエラーになります。その場合は、先にエラーの原因を直します。
行数と合計は、元のシステムの画面や帳票、請求書の合計など、Power Queryの外にある数字と照合してください。照合できる数字がない場合は、元のCSVの行数(見出しを除く)と一致しているかだけでも確認します。
3. 何行か元の値と見比べる
控えておいた「Betrag_元」列と変換後の「Betrag」列を並べて、次のような行を中心に何行か目で確かめます。
- 小数部分がある行(例:「12,5」→ 12.5)
- 1000以上で桁区切りがある行(例:「1.234,56」→ 1234.56)
- 0未満の値や、0に近い小さな値
確認が終わったら、控えの列は削除して構いません。
「置換」でカンマをピリオドに変える方法との違い
値の置換でカンマをピリオドに変えても、数値に直せることはあります。ただし「1.234,56」のように桁区切りのピリオドがある場合、カンマだけを置換すると「1.234.56」になり、変換できません。「ピリオドを削除してから、カンマをピリオドに置換する」という順番を守る必要があり、桁区切りがスペースのデータが混ざると、また別の置換が必要になります。
ロケールの指定は、「このデータはこの国の書き方」と1か所で宣言するだけなので、あとから読んだ人にも意図が伝わります。置換を重ねるより、ロケールで変換するほうが管理しやすくなります。
なお、Excelのシートに読み込んだあとの表示(桁区切りのカンマなど)は、セルの表示形式とPCの設定に従います。シートでの見た目が日本の書き方になっていても、Power Queryで正しい数値に変換できていれば問題ありません。
