適材適所

システム屋のくらげが気ままに書いているブログです。PowerShellやVBAなどプログラミング系の話をメインに書いています。

MENU

【Power Query M式言語】CSVファイルを読み込む方法について解説【Csv.Document関数】

Power QueryでM式言語でCSVファイルを読み込む方法について説明する記事です。

これを使えばVBA抜きでCSVファイルの読み込みをコードでできます!!便利!!

環境

Windows10
Excel2019

CSVファイルを読み込むには

M式言語でCSVファイルの読み込むにはM数式の2つの関数を組み合わせます。

2つの関数とは、Data関数群の中のContents関数とDocument関数です。

File.Contents関数はファイルをバイナリ形式で取得することができます。

Csv.Document関数はデータをCSVとして解析して、テーブルとして取得することができます。

いや、そもそもテーブルとか関数って何よ?ってときは↓の記事をご参照ください。

テーブルとは⇒【Power Query M式言語】テーブルについての解説 - 適材適所

関数とは⇒【Power Query M式言語】関数について解説 - 適材適所

次にそれぞれの関数の構文を見ていきます。

File.Contents関数の構文

File.Contents関数の構文は次のようになっています。

File.Contents(path as text, optional options as nullable record) as binary

pathはファイルのパスを指定します。

第二引数は現在、内部での使用を目的としているということなので、指定することはありません。ちなみにoptionalと書いてあるのは指定してもしなくてもいいという意味です。

この関数を単体で使用すると、pathで指定したファイルがバイナリで返ってきます。

ちなみに単体で実行するとこんな感じのアイコンが出てきます。

f:id:shinmai_papa:20211014130732p:plain

ここから展開してクエリを作成することもできます。

バイナリで返ってきたデータをCsv.Document関数を使ってCSVデータとして評価してあげます。

Csv.Document関数の構文

Csv.Document関数の構文は次のようになっています。

Csv.Document(source as any, optional columns as any, optional delimiter as any, optional extraValues as nullable number, optional encoding as nullable number) as table

こちらはちょっと複雑なので引数を1つずつ見ていくことにしましょう。

sourceについて

sourceは基本的にFile.Contents関数の結果を指定することが多いかと思います。ただし、型はany(全ての型の祖先)なので色々指定することができるようです。

といっても、私もどこまで指定できるかわかっていません。新しく分かったことがありましたら、随時加筆していきます。

columnsについて

columnsは少し複雑ですが、読み込むCSVのカラム名の指定、もしくは、CSVの詳細を設定することができます。もしくは、固定長のデータを読み込むときは別の値を設定しますが、それについては別の記事で解説することにして、ここではCSVファイルを読み込む方法に限って解説します。

読み込むCSVのカラム名を指定する

CSVファイルを読み込むときの引数columnsの1つ目の使い方として、CSVファイルの1行目からデータが始まっておりカラム名がCSVファイル上にないときに、カラム名を指定することができます。

指定するときは、リスト形式で指定します。

リスト形式について解説した記事⇒【Power Query M式言語】リストについての解説 - 適材適所

columnsにカラムを指定する例です。

Csv.Document(File.Contets("C:\test.csv"),{"名前","住所","年齢"},,ExtraValues.Ignore)

ExtraValues.Ignoreは指定したカラムの数が実際の数と一致しなかったときにカラムを無視する設定になります。

レコードを使ってCSVの詳細を設定する

CSVファイルを読み込むときの引数columnsの2つ目の使い方として、CSVの詳細を指定することができます。

この使い方をするときは、これ以降の引数であるdelimiter, extraValuesとencodingの3つはnullである必要があります。つまり指定しません。

「え?じゃあ文字コードとか指定できないの!?」と思われた、そこのあなた!そこはご心配には及びません。引数の指定方法が少し変わるだけです。具体的には、レコードを使ってCSVファイルの詳細を指定します。

レコードとは?⇒【Power Query M式言語】レコードについての解説 - 適材適所

レコード形式で指定できる項目は以下の5つです。

引数 概要
Delimiter CSVの区切り文字です。デフォルトは","です。
Columns カラムの数orカラムのリストを指定することができます。
Encoding 文字コードの指定です。デフォルトは65001 (UTF-8)です。
CsvStyle 引用符の扱いを指定します。CsvStyle関数の2つの関数のどちらかを指定します。CsvStyle.QuoteAfterDelimiter は引用符が区切り記号の直後でのみ有効となります。これがデフォルトです。CsvStyle.QuoteAlwaysは引用符がどこで使われていようが引用符とみなします。後者はあまり使うことはないと思われます。
QuoteStyle 引用符内の改行の処理方法の指定です。QuoteStyle.Noneはデフォルトで、引用符内で改行が出現したときにそこで行が切り替わる扱いになります。QuoteStyle.Csvは引用符内の改行はデータの一部として扱われます。

レコード形式を使ってCSVの詳細を指定する例

Csv.Document(File.Contents("C:\test.csv"),[Columns={"名前","住所"},Encoding=932])

注意!

レコード形式のキーは頭が大文字です。小文字だとエラーになります。

delimiter

Csvと言っていますが、delimiterにカンマ以外を指定することでCSVファイル以外も読み込むことができます。

encoding

encodingは対象のCSVの文字コードを指定してあげましょう。指定できるのはおそらくSystem.Text.Encodingクラスで使えるエンコーディングだと思われます。指定する際は数値もしくは次の定数で指定します。主要なエンコーディングはTextEncoding関数内に定義されているようです。下記のM式言語で一覧化することができます。

 
let
   encodings=[
   Ascii=TextEncoding.Ascii,
   BigEndianUnicode=TextEncoding.BigEndianUnicode,
   Unicode=TextEncoding.Unicode,
   UTF8=TextEncoding.Utf8,
   UTF16=TextEncoding.Utf16,
   Windows=TextEncoding.Windows
]
in
encodings

実行結果

f:id:shinmai_papa:20210916134654p:plain

なぜか2019の時点ではShift-Jisがありません(私が知らないだけ?)。

Shift-Jisを指定したい場合は「932」を指定するようです。

CSVを読込む

CSVファイルを読み込むには先の2つの関数を組み合わせます。

この例では、Cドライブ直下のテストデータ.csvというファイルを文字コード Shift-Jisを指定して読み込んでいます。

可読性を優先して、columnsにはレコード形式で文字コードだけを指定しています。

 
let
    CSVの読込=Csv.Document(File.Contents("C:\テストデータ.csv"),[Encoding=932])
in
    CSVの読込

1行目をヘッダとして読込む

CSVファイルの1行目がカラム名になっている場合は、先ほどの例に加え、さらにTable.PromoteHeaders関数を組み合わせることでCSVファイルの1行目をカラム名として認識させることができます。

 
let
   CSVの読込=Csv.Document(File.Contents("C:\テストデータ.csv"),[Encoding=932]),
   ヘッダの昇格=Table.PromoteHeaders(CSVの読込)
in
   ヘッダの昇格

終わりに

M式言語を使ってCSVファイルを読み込む方法について説明しました。

引数のcolumsのところが少し複雑ですが、オプションの引数も多いことから実際に指定する必要がある項目はあまり多くありません。Csv.Document関数を使いこなせれば大抵のファイルを読み込みできそうです。

CSVデータのExcelへの取込は別システムから出力されたデータの分析の際に必須になってきます。

取込後にM式言語でさらに項目の追加や、編集等を自動化すれば、さらに作業がはかどること間違いなし・・・!かも知れません。

というわけで、ここまでお読みいただき、ありがとうございました。