Power Query(M言語)入門
列数不定のCSVの取り込み

Power Query(パワークエリ)とM言語を練習問題を通して学んでいきます
公開日:2023-02-09 最終更新日:2023-02-17

列数不定のCSVの取り込み


「パワク4本目」
Power Query(M言語)の問題と解答・解説


本シリーズは、ツイッターと連動企画になります。
ツイッターで問題を出して、それに解答と解説をしていく形でPower QueryとM言語の理解を深めていきます。

パワク4本目

エクセル Excel Power Query M言語

#パワク4本目
列数不定のCSVをパワクで取り込んでください。
1行目をヘッダーして使用してください。
※バス・ファイル.名の指定は任意
※文字コードはUTF8(BOMなし)
※テストデータはメモ帳等で作成してください。
列数の変化に対応するだけの基本問題です。
#PowerQuery #M言語


解答コード

エクセル Excel Power Query M言語
let
    ソース = Csv.Document(File.Contents("D:\パワク練習\CSV\test.csv"),
    [Delimiter=",", Columns=null, Encoding=TextEncoding.Utf8, QuoteStyle=QuoteStyle.None]),
    昇格されたヘッダー数 = Table.PromoteHeaders(ソース, [PromoteAllScalars=true])
in
    昇格されたヘッダー数
上のクエリは、この下に掲載しているGUI操作で作成したクエリをほぼそのまま使用しています。
let
    ソース = Csv.Document(File.Contents("D:\パワク練習\CSV\test.csv"),
    [Delimiter=",", Columns=4, Encoding=65001, QuoteStyle=QuoteStyle.None]),
    昇格されたヘッダー数 = Table.PromoteHeaders(ソース, [PromoteAllScalars=true])
in
    昇格されたヘッダー数
変更箇所は、
Columns=4, Encoding=65001
この部分だけになります。
Columns=4
これは削除してしまっても良いですが、null指定でも列数不定に対応できます。
Encoding=65001
これは数値指定でもよいのですが、後々の事を考えて列挙型の指定に変更しています。
これらについては後述します。


GUI操作での作成

以下のGUI操作は一例です。

エクセル Excel Power Query M言語

CSVファイルを選択すると、

エクセル Excel Power Query M言語

単純に取り込むだけなら、これで「読み込み」だけです。
今回はクエリを変更したいので、「データの変換」
「1行目をヘッダーとして使用」

エクセル Excel Power Query M言語

エクセル Excel Power Query M言語

「変更された型」のステッブが勝手に入ってしまいます。
これらは不要なので削除します。

エクセル Excel Power Query M言語

中間のステッブを削除する時はこのような警告がでますが、そのまま「削除」
「詳細エディター」をみると、
let
    ソース = Csv.Document(File.Contents("D:\パワク練習\CSV\test.csv"),
    [Delimiter=",", Columns=4, Encoding=65001, QuoteStyle=QuoteStyle.None]),
    昇格されたヘッダー数 = Table.PromoteHeaders(ソース, [PromoteAllScalars=true])
in
    昇格されたヘッダー数
ここから、
Columns=4, Encoding=65001
この部分を変更したものが最初の解答コードになります。


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

columns は null、列数、列名のリスト、テーブル型、またはオプション レコードのいずれかになります。
delimiter は、行を連続する空白文字で分割する必要があることを示す、1 文字、文字の一覧、または値 "" を指定できます。 既定値:","。
extraValues のサポートされる値については、ExtraValues.Type を参照してください。
encoding はテキストのエンコードの種類を指定します。

これは理解しずらいですね。
解答でのスクリブトも上記とは違う使い方になっています。
Learnには続けて以下のように書かれています
レコードが columns (delimiter、extraValues、encoding は null) に対して指定されている場合、次のレコード フィールドを指定することができます。
なかなか難しい書き方をしてくれています・・・
つまり、第二構文として、

Csv.Documentのcolumnsにレコード指定する場合

Csv.Document(source as any, [レコード]) as table
この時のレコードフィールドとして以下が指定できます。

Delimiter:
列区切り記号。
既定値:","。
Columns
null、列数、列名のリスト、またはテーブル型のいずれかになります。
列数が入力で見つかった数よりも少ない場合、追加の列は無視されます。
列数が入力で見つかった数よりも多い場合、追加の列は null になります。
指定しない場合、列数は入力で見つかったものによって決まります。
Encoding
ファイルのテキスト エンコード。
既定値: 65001 (UTF-8)。
CsvStyle
引用符の処理方法を指定します。
CsvStyle.QuoteAfterDelimiter (既定値): フィールド内の引用符は、区切り記号の直後でのみ有効です。
CsvStyle.QuoteAlways: フィールド内の引用符は、使用される場所を問わずいつでも有効です。
QuoteStyle
引用符で囲まれた改行の処理方法を指定します。
QuoteStyle.None (既定値): すべての改行は、引用符で囲まれた値の中で出現した場合でも、現在の行の末尾として扱われます。 QuoteStyle.Csv: 引用符で囲まれた改行は、現在の行の末尾としてではなく、データの一部として扱われます。


TextEncoding列挙型

列挙型を使えば候補表示されます。

エクセル Excel Power Query M言語

名前 説明
TextEncoding.Utf16 1200 UTF16 リトル エンディアン バイナリ形式を選択するために使用します。
TextEncoding.Unicode 1200 UTF16 リトル エンディアン バイナリ形式を選択するために使用します。
TextEncoding.BigEndianUnicode 1201 UTF16 ビッグ エンディアン バイナリ形式を選択するために使用します。
TextEncoding.Windows 1252 Windows バイナリ形式を選択するために使用します。
TextEncoding.Ascii 20127 ASCII バイナリ形式を選択するために使用します。
TextEncoding.Utf8 65001 UTF8 バイナリ形式を選択するために使用します。




同じテーマ「PowerQuery(M言語)入門」の記事

別ブックのシートを列可変で取り込む

1本目 別ブックの特定シートをパワクで取り込んでください。ブックのパスとシート名は任意(定数値指定でよい) 取り込むシートの列数や列タイトルは可変。つまり、ブック・シートだけ指定されている内容不明の表を取り込むという事。
セル値でパス・ブック・シート名を指定
2本目 別ブックの特定シートをパワクで取り込んでください。テーブル"tbl設定"に、パス・ブック名・シート名が入っています。この"tbl設定"の情報を元に取り込んでください。
別ブックの最終シートの取り込み
3本目 別ブックの最終シート(一番右の最後のシート)をパワクで取り込んでください。バス・ブック名の指定は任意 シート数が変化しても、とにかく一番最後のシートを取り込むという事です。#パワク#PowerQuery 解答コード let ソース=Excel.Workbook(File.Contents("D:\パ…
列数不定のCSVの取り込み
CSVのA列が日付の行だけを取り込む
5本目 列数不定のCSVのA列が日付の行だけをパワクで取り込んでください。4本目の続きです。4本目にA列日付で抽出するステッブを追加してください。A列は日付型で取り込んでください。A列の列名は任意。#PowerQuery#M言語 解答コード let ソース=Csv.Document(File.Contents(&qu…
A列のヘッダー名を変更する
6本目 CSVをパワクで取り込みます。5本目の続きです。A列のヘッダーは本来は「日付」が正しいのですが、たまに「日付け」となっている場合もあるようです。※さらに他表記の場合もある。A列のヘッダを「日付」に統一して出力するようにしてください。
「売上」が数値の行のみ取り込む
7本目 CSVをパワクで取り込みます。列「売上」が非数値および空の行を削除して、「売上」が数値の行のみ取り込んでください。#PowerQuery#M言語 解答コード let ソース=Csv.Document(File.Contents("D:\パワク練習\CSV\test2.csv"),
2つのテーブルのマージ
8本目 ブック内に、「tbl個人」「tbl都道府県」があります。この2つのテーブルを結合して、添付サンブルのように出力してください。※「tbl個人」の都道府県には「県」の文字が入っていません。出力は「県」の入った県名で。
グルーブ内の最小・最大
9本目 ブック内に日付と商品コードを持つテーブル「tbl伝票」があります。商品コード毎の日付の最小値と最大値(最古日付と最新日付)を出力してください。※サンブルデータはALT #PowerQuery#M言語 解答コード let ソース=Excel.CurrentWorkbook(){[Name="tbl伝票…
グルーブ内の最小・最大
9本目 ブック内に日付と商品コードを持つテーブル「tbl伝票」があります。商品コード毎の日付の最小値と最大値(最古日付と最新日付)を出力してください。※サンブルデータはALT #PowerQuery#M言語 解答コード let ソース=Excel.CurrentWorkbook(){[Name="tbl伝票…
有効な最新単価の取得
10本目 「tbl伝票」(日付,コード) 「tblマスタ」(コード,日付,単価) マスタの日付は(これ以降有効となる)適用開始日です。「tbl伝票」に単価を付して出力してください。※例.2/5のA01はマスタの2/1が適用されます。


新着記事NEW ・・・新着記事一覧を見る

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ