[[20221011152322]] 『PowerQueryでの抽出方法について』(めいぷる) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『PowerQueryでの抽出方法について』(めいぷる)

PowerQueryで指定したフォルダ配下にあるExcelを全て取り込みます。
A列はファィル名、B列が取込んだデータです。

表形式のデータが縦に連なっている形式で、必要な行はA列のファイル名毎に
機関名〜氏名までの項目とデータになります。
項目名とデータが":"で連結されて1セルに入力されています。
(「報告書」行は不要ですが、データ1件毎の区切りの意味で記載しています。)

  A列 B列

 1 ABC001.xlsx 報告書
 2 ABC001.xlsx 
 3 ABC001.xlsx 
 4 ABC001.xlsx 機関名:AAA
 5 ABC001.xlsx 2.課題:あいう
 6 ABC001.xlsx 3.部署名:bbb
 7 ABC001.xlsx 4.番号:ABC001
 8 ABC001.xlsx 氏名:山田 太郎
 9 ABC001.xlsx 
10 ABC001.xlsx 
11 ABC001.xlsx 
12 ABC001.xlsx 
13 EFG002.xlsx 報告書
14 EFG002.xlsx 
15 EFG002.xlsx 
16 EFG002.xlsx 機関名:EEE
17 EFG002.xlsx 2.課題:あいう
18 EFG002.xlsx かきく
19 EFG002.xlsx 3.部署名:ccc
20 EFG002.xlsx 4.番号:xxxxxxx002
21 EFG002.xlsx 氏名:佐藤 一郎

ここから、項目名で判定して必要な行のみに絞りこむことは出来たのですが、
18行目のように「2.課題」のデータが1セルに収まらずに次の行に跨がるケースがあります。(2行とは限らずそれ以上の複数行になる場合があります。)
この場合、項目名にあたる文言がないので必要な行として抽出出来なくて困っています。(他の不要行との差別化がうまく出来ない)

最終的には以下の形式に成形し、「2.課題」と「3.部署名」に挟まれた項目名のない行を「2.課題」の":"以降に記載されている内容と結合したいです。

     A      B            C     D       E
 1 機関名 課題         部署名 番号    氏名
 2 AAA    あいう       bbb    ABC001 山田 太郎
 3 EEE    あいうかきく ccc    EFG002 佐藤 一郎

現在のクエリは以下の通りです。
(インデックス列は追加したものの使用していません)
let

    folderpath1 = Excel.CurrentWorkbook(){[Name="入力指定TBL"]}[Content]{0}[入力フォルダ],
    ソース = Folder.Files(folderpath1),
    #"フィルター選択された非表示の File1" = Table.SelectRows(ソース, each [Attributes]?[Hidden]? <> true),
    カスタム関数の呼び出し1 = Table.AddColumn(#"フィルター選択された非表示の File1", "ファイルの変換", each ファイルの変換([Content])),
    削除された他の列1 = Table.SelectColumns(カスタム関数の呼び出し1, {"Name", "ファイルの変換"}),
    #"展開された ファイルの変換" = Table.ExpandTableColumn(削除された他の列1, "ファイルの変換", {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7"}, {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7"}),
    置き換えられた値 = Table.ReplaceValue(#"展開された ファイルの変換",null,"",Replacer.ReplaceValue,{"Column1"}),
    削除された他の列 = Table.SelectColumns(置き換えられた値,{"Name", "Column1"}),
    追加されたインデックス = Table.AddIndexColumn(削除された他の列, "インデックス", 0, 1, Int64.Type),
    追加された条件列 = Table.AddColumn(追加されたインデックス, "判定", each if Text.Start([Column1],3) = "機関名" then "○" else if Text.Start([Column1],2) = "氏名" then  "○" else if  (Text.Start([Column1],1) = "1" or Text.Start([Column1],1) = "2" or Text.Start([Column1],1) = "3" or Text.Start([Column1],1) = "4") then "○" else ""),
    フィルターされた行 = Table.SelectRows(追加された条件列, each ([判定] = "○"))
in
    フィルターされた行

ファイルの変換
let

    ソース = (パラメーター1) => let
        ソース = Excel.Workbook(パラメーター1, null, true),
        Sheet1_Sheet = ソース{[Item="Sheet1",Kind="Sheet"]}[Data]
    in
        Sheet1_Sheet
in
    ソース    

< 使用 Excel:Office365、使用 OS:Windows10 >


すみません、最終形が誤っていました。
A列にファイル名が入ります。

     A          B       C            D     E       F
 1 ファイル名  機関名 課題         部署名 番号    氏名
 2 ABC001.xlsx AAA    あいう       bbb    ABC001 山田 太郎
 3 EFG002.xlsx EEE    あいうかきく ccc    EFG002 佐藤 一郎

(めいぷる) 2022/10/11(火) 16:34:50


 「:」が含まれるかどうかで条件分岐出来ませんか?
 列の分割したらどうでしょう
 その先は各人毎のデータでグループ化できないとちょっとつらいかもしれません
(´・ω・`) 2022/10/11(火) 17:00:03

 回答じゃなく確認だけで恐縮です。
 EFG002.xlsxの内容はどのようなものなんでしょうか。
 行番号、列番号が分かる形式で示してもらえませんか?
 そちらでは見て分かっているのでしょうけど、
 他人からは見えないので示してもらいたいのです。
  
(γ) 2022/10/11(火) 19:42:03

 この状態から、  

 報告書
 機関名:AAA
 2.課題:あいう
 3.部署名:bbb
 4.番号:ABC001
 氏名:山田 太郎
 報告書
 機関名:EEE
 2.課題:あいう
 かきく
 3.部署名:ccc
 4.番号:xxxxxxx002
 氏名:佐藤 一郎
 
 こうしてはどうか
 
 let
    ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
    変更された型 = Table.TransformColumnTypes(ソース,{{"列1", type text}}),
    フィルターされた行 = Table.SelectRows(変更された型, each ([列1] <> "報告書")),
    区切り記号による列の分割 = Table.SplitColumn(フィルターされた行, "列1", Splitter.SplitTextByDelimiter(":", QuoteStyle.Csv), {"列1.1", "列1.2"}),
    変更された型1 = Table.TransformColumnTypes(区切り記号による列の分割,{{"列1.1", type text}, {"列1.2", type text}}),
    追加された氏名 = Table.AddColumn(変更された型1, "追加氏名", each if [列1.1]="氏名" then [列1.2] else null),
    上方向へコピー済み = Table.FillUp(追加された氏名,{"追加氏名"}),
    追加された項目名 = Table.AddColumn(上方向へコピー済み, "項目名", each if [列1.2]=null then "2.課題" else [列1.1]),
    追加された内容 = Table.AddColumn(追加された項目名, "内容", each if [列1.2]=null then [列1.1] else [列1.2]),
    削除された他の列 = Table.SelectColumns(追加された内容,{"追加氏名", "項目名", "内容"}),
    グループ化された行 = Table.Group(削除された他の列, {"追加氏名", "項目名"}, {{"内容の連結", each Text.Combine([内容]), type text}}),
    ピボットされた列 = Table.Pivot(グループ化された行, List.Distinct(グループ化された行[項目名]), "項目名", "内容の連結")
 in
    ピボットされた列
(´・ω・`) 2022/10/12(水) 06:32:49

例外の可能性が「2.課題」の下行限定でいいなら

let

    workbook = Excel.CurrentWorkbook(),
    folderpath = workbook{[Name="入力指定TBL"]}[Content]{0}[入力フォルダ],
    ソース = Folder.Files(folderpath),
    隠しファイル除外 = Table.SelectRows(ソース, each [Attributes][Hidden]<>true),
    列の選択 = Table.SelectColumns(隠しファイル除外, {"Content", "Name", "Folder Path"}),
    テーブル列の追加 = Table.AddColumn(列の選択, "テーブル", each [
        fp = [Folder Path],
        fn = [Name],
        フォルダ指定 = 列の選択{[#"Folder Path"=fp, Name=fn]}[Content],
        ブック指定 = Excel.Workbook(フォルダ指定),
        インポート = ブック指定{[Item="Sheet1",Kind="Sheet"]}[Data]
    ][インポート]),
    列の展開 = Table.ExpandTableColumn(テーブル列の追加, "テーブル", {"Column1"}),
    不要列の削除 = Table.RemoveColumns(列の展開, {"Content", "Folder Path"}),
    行の抽出 = Table.SelectRows(不要列の削除, each [Column1]<>null and [Column1]<>"報告書"),
    列の編集 = Table.TransformColumns(行の抽出,
        {"Column1", each if Text.Contains(_, ":") then _ else "2.課題:" & _}
    ),
    列の分割 = Table.SplitColumn(列の編集, "Column1",
        Splitter.SplitTextByDelimiter(":", QuoteStyle.Csv), {"Column1", "Column2"}
    ),
    行のグループ化 = Table.Group(
        列の分割, {"Name", "Column1"}, {"グループ", each _, type table [Column2=text]}
    ),
    列2の追加 = Table.AddColumn(
        行のグループ化, "Column2", each Text.Combine([グループ][Column2]), type text
    ),
    グループ列の削除 = Table.RemoveColumns(列2の追加,{"グループ"}),
    列のピボット = Table.Pivot(
        グループ列の削除, List.Distinct(グループ列の削除[Column1]), "Column1", "Column2"
    ),
    列名の変更 = Table.RenameColumns(列のピボット, {
        {"Name", "ファイル名"},
        {"機関名", "機関名"},
        {"2.課題", "課題"},
        {"3.部署名", "部署名"},
        {"4.番号", "番号"},
        {"氏名", "氏名"}
    })
in
    列名の変更

でどうでしょう。
(d-q-t-p) 2022/10/12(水) 13:55:19


皆様、コメント頂きありがとうございます。

´・ω・`さんとd-q-t-pさんから頂いたクエリをそれぞれ試してみたのですが、
私の説明が足りていなかったことが分かりました。

もう一度、質問をし直します。
現在のクエリは以下のようにしています。

let

    folderpath1 = Excel.CurrentWorkbook(){[Name="入力指定TBL"]}[Content]{0}[入力フォルダ],
    ソース = Folder.Files(folderpath1),
    #"フィルター選択された非表示の File1" = Table.SelectRows(ソース, each [Attributes]?[Hidden]? <> true),
    カスタム関数の呼び出し1 = Table.AddColumn(#"フィルター選択された非表示の File1", "ファイルの変換", each ファイルの変換([Content])),
    削除された他の列1 = Table.SelectColumns(カスタム関数の呼び出し1,{"Name", "ファイルの変換"}),
    #"展開された ファイルの変換" = Table.ExpandTableColumn(削除された他の列1, "ファイルの変換", {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7"}, {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7"}),
    削除された他の列 = Table.SelectColumns(#"展開された ファイルの変換",{"Name", "Column1"}),
    #"名前が変更された列 " = Table.RenameColumns(削除された他の列,{{"Name", "ファイル名"}}),
    区切り記号による列の分割 = Table.SplitColumn(#"名前が変更された列 ", "Column1", Splitter.SplitTextByEachDelimiter({":"}, QuoteStyle.Csv, false), {"Column1.1", "Column1.2"}),
    置き換えられた値1 = Table.ReplaceValue(区切り記号による列の分割,null,"",Replacer.ReplaceValue,{"Column1.1"}),
    置き換えられた値2 = Table.ReplaceValue(置き換えられた値1,null,"",Replacer.ReplaceValue,{"Column1.2"}),
    追加されたカスタム = Table.AddColumn(置き換えられた値2, "項目", each if Text.PositionOf([Column1.1],"機関名") >= 0 then "機関名"
else if Text.PositionOf([Column1.1],"研究開発事業名") >= 0 then "研究開発事業名"
else if Text.PositionOf([Column1.1],"研究開発課題名") >= 0 then "研究開発課題名"
else if Text.PositionOf([Column1.1],"課題管理番号") >= 0 then "課題管理番号"
else if Text.PositionOf([Column1.1],"所属部署") >= 0 then "所属部署"
else if Text.PositionOf([Column1.1],"氏名") = 0 then "氏名"
else ""),
    追加されたカスタム1 = Table.AddColumn(追加されたカスタム, "データ", each if [項目] <> "" then [Column1.2] else null),
    フィルターされた行 = Table.SelectRows(追加されたカスタム1, each ([項目] <> "")),
    削除された他の列2 = Table.SelectColumns(フィルターされた行,{"ファイル名", "項目", "データ"}),
    ピボットされた列 = Table.Pivot(削除された他の列2, List.Distinct(削除された他の列2[項目]), "項目", "データ")
in
    ピボットされた列

上記クエリの「削除された他の列」のステップ時点で以下のようなデータになっています。
(■だけの部分はデータがありますが、抽出対象外です。":"が含まれている場合もあります。)

	A	B
1	ファイル名	Column1
2	ABC0001.xlsx	null
3	ABC0001.xlsx	令和3年度 報告書
4	ABC0001.xlsx	○○ 殿
5	ABC0001.xlsx	機関名:学校法人あああ学園
6	ABC0001.xlsx	機関の長の職名:理事長
7	ABC0001.xlsx	機関の長の氏名:小林 弘祐
8	ABC0001.xlsx	(公印不要)
9	ABC0001.xlsx	次の職員の、〜〜
10	ABC0001.xlsx	1.研究開発事業名:あいう
11	ABC0001.xlsx	2.研究開発課題名:えええ
12	ABC0001.xlsx	おおお
13	ABC0001.xlsx	3.課題管理番号 :ABC001
14	ABC0001.xlsx	4.所属部署:▲▲部
15	ABC0001.xlsx	氏名:山田 太郎
16	ABC0001.xlsx	分類:■代表者
17	ABC0001.xlsx	null
18	ABC0001.xlsx	5.内容
19	ABC0001.xlsx	かきくけこ
20	ABC0001.xlsx	さしすせそ
21	ABC0001.xlsx	→ これにて記入終了
22	ABC0001.xlsx	■
23	ABC0001.xlsx	■
24	ABC0001.xlsx	■
25	ABC0001.xlsx	■
26	ABC0001.xlsx	■
27	ABC0001.xlsx	■
28	ABC0001.xlsx	■
29	ABC0001.xlsx	■
30	ABC0001.xlsx	■
31	ABC0001.xlsx	■
32	ABC0001.xlsx	null
33	ABC0001.xlsx	null
34	EFG0002.xlsx	null
35	EFG0002.xlsx	null
36	EFG0002.xlsx	令和3年度 報告書
37	EFG0002.xlsx	○○ 殿
38	EFG0002.xlsx	機関名:○○大学
39	EFG0002.xlsx	機関の長の職名:学長
40	EFG0002.xlsx	機関の長の氏名:佐藤 史郎
41	EFG0002.xlsx	(公印不要)
42	EFG0002.xlsx	■
43	EFG0002.xlsx	null
44	EFG0002.xlsx	1.研究開発事業名:AAA
45	EFG0002.xlsx	2,研究開発課題名:BBB
46	EFG0002.xlsx	CCC
47	EFG0002.xlsx	DDD
48	EFG0002.xlsx	3.課題管理番号 :EFG002
49	EFG0002.xlsx	4.所属部署:▲研究科
50	EFG0002.xlsx	氏名:田中 一郎
51	EFG0002.xlsx	null
52	EFG0002.xlsx	null
53	EFG0002.xlsx	null
54	EFG0002.xlsx	5.研究開発の内容
55	EFG0002.xlsx	■
56	EFG0002.xlsx	■
57	EFG0002.xlsx	→ これにて記入終了
58	EFG0002.xlsx	■
59	EFG0002.xlsx	■
60	EFG0002.xlsx	■
61	EFG0002.xlsx	■
62	EFG0002.xlsx	■
63	EFG0002.xlsx	■
64	EFG0002.xlsx	■
65	EFG0002.xlsx	■
66	EFG0002.xlsx	■
67	EFG0002.xlsx	■
68	EFG0002.xlsx	null

ここから一度":"で列を分割し([Column1.1]と[Column1.2])、「追加されたカスタム」のステップで[項目]列を追加し、
":"の左側の項目名にあたる部分([Column1.1])に抽出したい名称があるかどうかを判定して
あったら数字部分などを除いて統一した項目名を設定します。
その後、[項目]列が設定されている行でフィルタしています。

この時、課題名が複数行に渡っている場合に[Column1.1]はデータ内容だけのため項目名が設定できないので、
後のステップで抽出対象にならないのが困っているところです。

最初の説明が分かりずらくて申し訳ありませんでした。
今回の説明でおわかりいただけますでしょうか。

再度よろしくお願いします。

(めいぷる) 2022/10/12(水) 15:50:16


いや説明が分かりづらいとかは別としてまずはご自身が提示したサンプルで
上手くいくか検証して返事をするのが先では?

この調子だと回答する度に条件が変わったり増えたりする可能性が否定でき
ません。
(d-q-t-p) 2022/10/12(水) 15:57:05


失礼しました。

d-q-t-pさんがご提示くださった 2022/10/12(水) 13:55:19 のクエリだと、
抽出対象外の■の部分に":"が含まれていた場合に"課題"として抽出されてしまい、
うまくいきませんでした。

(めいぷる) 2022/10/12(水) 16:10:30


また、(´・ω・`) さんがご提示くださった 2022/10/12(水) 06:32:49 のクエリの場合は、
最初の説明で例示したのがほぼ抽出したい項目名に絞られたデータだったため、
その例示からの成形はうまくいきますが、課題が複数行にわたる場合の抽出がやはり出来ませんでした。

(めいぷる) 2022/10/12(水) 16:14:10


必要なデータかどうかを予めリストから判定するしかないと思います。

「ABC0001.xlsx」では番号が半角数字。「EFG0002.xlsx」では番号が全角数字になっていますが
これは実際のデータでもこうなっているのでしょうか。
(d-q-t-p) 2022/10/12(水) 16:52:03


d-q-t-pさん、コメントありがとうございます。

番号はファイルによって全角も半角もあります。
Excel関数のように全角あるいは半角に変換する関数はありませんよね。
そのため、仕方なくText.PositionOf([Column1.1],"研究開発事業名")で該当の項目名が含まれるかを
チェックしている次第です。

いろいろ試行錯誤して、課題が2行までであればうまく抽出出来るようになったのですが、
3行以上になるとうまくいかず・・・。

(めいぷる) 2022/10/12(水) 17:04:02


> Excel関数のように全角あるいは半角に変換する関数はありませんよね。
関数は用意されていませんがリスト変換すればできます。
https://qiita.com/PowerBIxyz/items/e128e874fe47957d1dfd

let

    必要列名 = "機関名,研究開発事業名,研究開発課題名,課題管理番号,所属部署,氏名",
    workbook = Excel.CurrentWorkbook(),
    folderpath = workbook{[Name="入力指定TBL"]}[Content]{0}[入力フォルダ],
    ソース = Folder.Files(folderpath),
    隠しファイル除外 = Table.SelectRows(ソース, each [Attributes][Hidden]<>true),
    列の選択 = Table.SelectColumns(隠しファイル除外, {"Content", "Name", "Folder Path"}),
    テーブル列の追加 = Table.AddColumn(列の選択, "テーブル", each [
        fp = [Folder Path],
        fn = [Name],
        フォルダ指定 = 列の選択{[#"Folder Path"=fp, Name=fn]}[Content],
        ブック指定 = Excel.Workbook(フォルダ指定),
        インポート = ブック指定{[Item="Sheet1",Kind="Sheet"]}[Data]
    ][インポート]),
    列の展開 = Table.ExpandTableColumn(テーブル列の追加, "テーブル", {"Column1"}),
    値の置換1 = Table.ReplaceValue(列の展開,null,"",Replacer.ReplaceValue,{"Column1"}),
    不要列の削除 = Table.RemoveColumns(値の置換1, {"Content", "Folder Path"}),
    行のグループ化1 = Table.Group(不要列の削除, {"Name"}, {"グループ", each [
        列名リスト = Text.Split(必要列名, ","),
        位置 = {false} & Table.AddColumn(_, "位置", each Text.Contains([Column1], "2.研究開発課題名"))[位置],
        再構成 = Table.FromColumns(Table.ToColumns(_) & {位置}, type table [Name=text, Column1=text, 位置=any]),
        列2の追加 = Table.AddColumn(再構成, "Column2", each if [位置] then "2.研究開発課題名:" & [Column1] else [Column1], type text),
        フラグ列の追加 = Table.AddColumn(列2の追加, "フラグ", each [
            名前 = [Column2],
            位置 = [位置],
            選択 = List.Select(列名リスト, each Text.Contains(名前, _)),
            件数 = List.Count(選択)
        ][件数], type table [Column2=text]),
        行の抽出 = Table.SelectRows(フラグ列の追加, each [フラグ]>0)
    ][行の抽出]}),
    グループ列の展開 = Table.ExpandTableColumn(行のグループ化1, "グループ", {"Column2"}, {"Column1"}),
    値の置換2 = Table.ReplaceValue(グループ列の展開,",",".",Replacer.ReplaceText,{"Column1"}),
    列の分割1 = Table.SplitColumn(値の置換2, "Column1", Splitter.SplitTextByDelimiter(":", QuoteStyle.Csv), {"Column1", "Column2"}),
    列の分割2 = Table.SplitColumn(列の分割1, "Column1", Splitter.SplitTextByDelimiter(".", QuoteStyle.Csv), {"Column1.1", "Column1.2"}),
    列1の追加 = Table.AddColumn(列の分割2, "Column1", each if [Column1.2]=null then [Column1.1] else [Column1.2]),
    行のグループ化2 = Table.Group(列1の追加, {"Name", "Column1"}, {"tbl", each _, type table [Column2=text]}),
    列2の追加 = Table.AddColumn(行のグループ化2, "Column2", each Text.Combine([tbl][Column2])),
    列の削除 = Table.RemoveColumns(列2の追加,{"tbl"}),
    列のピボット = Table.Pivot(列の削除, List.Distinct(列の削除[Column1]), "Column1", "Column2")
in
    列のピボット

これ以上 後出しで条件が出てきても対応はできかねますが ひとまず上の例ならこれでできるか
と思います。
(d-q-t-p) 2022/10/12(水) 17:12:21


d-q-t-pさん、ありがとうございます。
今度は希望の形になりました!

ところどころ理解が追いついていないので、じっくり追ってみます。
もし理解できない部分がありましたらまた質問しますので、
その時はご教示いただけると幸いです。

本当にありがとうございました。

(めいぷる) 2022/10/12(水) 17:42:51


d-q-t-pさん、昨日はありがとうございました。

教えていただいたクエリで何をしているか、1ステップずつ確認しています。

    行のグループ化1 = Table.Group(不要列の削除, {"Name"}, {"グループ", each [
        列名リスト = Text.Split(必要列名, ","),
        位置 = {false} & Table.AddColumn(_, "位置", each Text.Contains([Column1], "2.研究開発課題名"))[位置],
        再構成 = Table.FromColumns(Table.ToColumns(_) & {位置}, type table [Name=text, Column1=text, 位置=any]),
        列2の追加 = Table.AddColumn(再構成, "Column2", each if [位置] then "2.研究開発課題名:" & [Column1] else [Column1], type text),
        フラグ列の追加 = Table.AddColumn(列2の追加, "フラグ", each [
            名前 = [Column2],
            位置 = [位置],
            選択 = List.Select(列名リスト, each Text.Contains(名前, _)),
            件数 = List.Count(選択)
        ][件数], type table [Column2=text]),
        行の抽出 = Table.SelectRows(フラグ列の追加, each [フラグ]>0)
    ][行の抽出]}),

上の「行のグループ化1」のステップでやっていることは大体分かるのですが、
その中の【フラグ列の追加】の部分について教えて下さい。

やっていることは"Column2"の列で列名リストに該当する文字列が含まれている行にフラグを立てていると思うのですが、
each[]の中身の「選択 = List.Select(列名リスト, each Text.Contains(名前, _)),」の部分で"_"は何を受けているのでしょうか。

「行のグループ化1」の中身を理解したくて、自分で分解したクエリを作って検証しているのですが、
ここのところで『Expression.Error: フィールド アクセスを型 Text に適用できません。詳細:  Value=機関名 Key=Column2』のエラーとなります。

eachと"_"の理解がいまいち出来ていないので、いろいろ修正してみたのですが分からず・・・・。

もし、見て下さったら教えていただけるとうれしいです。

(めいぷる) 2022/10/13(木) 17:49:37


自分で分解して作成したクエリですが、d-q-t-pさんのクエリを途中まで使って"Name"と"column1"のテーブルを一旦作成しています。(テーブル1)
それを元に以下のクエリで、【行のグループ化1】の動きを確認しようとしています。

let

    必要列名 = "機関名,研究開発課題名,課題管理番号,氏名,研究開発事業名,研究開発担当者の所属部局",

    ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
    列名リスト = Text.Split(必要列名, ","),
    位置 = {false} & Table.AddColumn(ソース, "位置", each Text.Contains([Column1], "2.研究開発課題名"))[位置],
    再構成 = Table.FromColumns(Table.ToColumns(ソース) & {位置}, type table [Name=text, Column1=text, 位置=any]),
    列2の追加 = Table.AddColumn(再構成, "Column2", each if [位置] then "2.研究開発課題名:" & [Column1] else [Column1], type text),
        選択 = List.Select(列名リスト, each Text.Contains([Column2], _)),
        件数 = List.Count(選択),

     列3の追加 =   Table.FromColumns(選択,type table [Name=text])
in
    列3の追加

ここの「選択」のステップがエラーとなります。

(めいぷる) 2022/10/13(木) 18:15:55


 d-q-t-pさんがこないようなので、ちょっと口出しします。
 d-q-t-pさんのクエリの解説ではありません

 全てのファイルで、 → これにて記入終了 があるなら、
 これ以降の行は「ファイルの変換」の時点で削除すべきです。

 例として、列1が "キーワード" の行まで列を保持するのは、

 保存された先頭行 = Table.FirstN(ソース,List.PositionOf(ソース[列1],"キーワード"))

 みたいな感じできます
(´・ω・`) 2022/10/14(金) 09:17:25

´・ω・`さん、コメントありがとうございます。

ご指摘いただいたように、「ファイルの変換」の時点で明らかに不要な行は
削除した方が処理が軽くなりますね。

ただ、入力ファイルは700件くらいあるのですが、
全てのファイルに「→ これにて記入終了」があるのかどうかは不明です。
ある程度様式の決まったファイルなのであるのではないかと推察は出来ますが、
確実とは言い切れないです。
(依頼されて作成しているツールで、テスト用に幾つかファイルをもらっていますが
全量のファイルを確認していないため)

Table.FirstN関数でキーワードがない場合は全行取込むだけで
エラーにならないのであれば、追加してみようと思います。

(めいぷる) 2022/10/14(金) 09:41:26


 >全てのファイルに「→ これにて記入終了」があるのかどうかは不明です。
 ファイルの記入ルールを明確にして示してもらわないと、回答者はなにもできません

 (1) まず1つのファイルを例に、自動化可能なレベルの記載ルールを明確に示すべきです
 (2) いまは、全ファイルを結合したあとのクエリを作成してますが、
   まずは、1つのファイルを所定の様式にすることを目指した方がいいとおもいます
 (3) 上記の(2)ができれば、それを関数にすれば、全ファイルに適用して結合できます
(´・ω・`) 2022/10/14(金) 09:58:18

私宛の質問がついているのに今気付きました。
こういう場合は URLを付けて新しく質問し直したほうがいいと思います。

はー終わった終わったと思ってファイル削除したので 既に自分で何をやっていたの
か忘れてしまっていますが

> each[]の中身の「選択 = List.Select(列名リスト, each Text.Contains(名前, _)),」
> の部分で"_"は何を受けているのでしょうか。
「_」の意味は下記のページの説明が分かりやすいかと思います。
https://qiita.com/PowerBIxyz/items/6668537a576592a04bcf

> ここの「選択」のステップがエラーとなります。
「選択」が先のステップにかかっていないのでそうなります。テーブルの中で行っている
処理だったかと思いますので 無理やりやるなら

    選択 = Table.AddColumn(列2の追加, "フラグ", (x)=> List.Select(列名リスト, each Text.Contains(x[Column2], _))),
    件数 = Table.TransformColumns(選択, {"フラグ", each List.Count(_)})

こういう感じのことをやっていたはずです。レコードでやってもいいし let〜inでやって
もいいと思います。
(d-q-t-p) 2022/10/14(金) 10:13:13


´・ω・`さん、
>ファイルの記入ルールを明確に
現状、以下の文言が含まれている行データがあるということだけです。
"機関名,研究開発事業名,研究開発課題名,課題管理番号,所属部署,氏名"
それ以外はどのような共通データがあるのがまでは分かりません。(というか調べていません)
そして、項目名の頭に付く項番の数字が全角だったり半角だったり、
数字の後が"."だったり","と、統一されていないデータなのです。

それに関してはこちらでどうこうできるものではないので、
『そういう状態である』という前提の元で、どうにか加工できないかと苦労している訳です。

d-q-t-pさん、見つけていただきありがとうございます。

>こういう場合は URLを付けて新しく質問し直したほうがいいと思います。
続きの質問なのでここに書き込みましたが、次回からはそのようにします。

eachと"_"(アンダースコア)についてURLの紹介ありがとうございます。
こちらの頁も確か読んだことはあると思います。
書いてある説明を読むとなるほどと思うのですが、多分本当には理解しきれていないので
自分で書かなければいけなくなったときに応用できない状態です。
もっと勉強します。

>「選択」が先のステップにかかっていないのでそうなります。
前のステップを受けないと参照するテーブルが指定出来ないからですね。

   選択 = Table.AddColumn(列2の追加, "フラグ", (x)=> List.Select(列名リスト, each Text.Contains(x[Column2], _))),

(x)=> List.Select(列名リスト, each Text.Contains(x[Column2], _)) の部分ですが、

xを使って前のステップの列2の追加を参照させているという理解で合っていますか?(Text.Containsにxの引数を渡している)
そうなると、eachとそれを受ける"_"は列名リストのそれぞれということなのでしょうか。
その理解で正しければ、私の疑問も解消するのですが。

(めいぷる) 2022/10/14(金) 10:54:38


> xを使って前のステップの列2の追加を参照させている
それで合ってます。

> eachとそれを受ける"_"は列名リストのそれぞれということなのでしょうか。
その通りです。
(d-q-t-p) 2022/10/14(金) 11:13:48


d-q-t-pさん、お付き合いいただきありがとうございました。

eachと"_"(アンダースコア)について少し理解が深まったように思います。

引き続き教えていただいたクエリの解析を進めて理解できるよう、
また、自分でも書けるように勉強しますので、新たな疑問がでた際には
スレッドを立てて質問させていただきます。

その際お目にとまりましたら、またご教示お願いします。

(めいぷる) 2022/10/14(金) 11:19:34


 >現状、以下の文言が含まれている行データがあるということだけです。
 >"機関名,研究開発事業名,研究開発課題名,課題管理番号,所属部署,氏名"
 なるほど、d-q-t-pさんは、すでにそれを読み取っていたわけですね

 私は余計なまぜっかえしをしてしまったようです
 すみません
 私はここまでにしておきます
(´・ω・`) 2022/10/14(金) 11:23:08

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.