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言語)入門」の記事

別ブックのシートを列可変で取り込む
セル値でパス・ブック・シート名を指定
別ブックの最終シートの取り込み
列数不定のCSVの取り込み
CSVのA列が日付の行だけを取り込む
A列のヘッダー名を変更する
「売上」が数値の行のみ取り込む
2つのテーブルのマージ
グルーブ内の最小・最大
グルーブ内の最小・最大
有効な最新単価の取得


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

テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)
イータ縮小ラムダ(eta reduced lambda)|エクセル入門(2023-11-20)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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



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