Excel (一般機能)

Excelの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Microsoft 365)
パワークエリでフォルダーからデータ取得する際、横に結合したい。
投稿日時: 23/07/06 08:48:47
投稿者: まるえん

教えて下さい。
 
列に項目、行に時刻が入った複数のCSVファイルを、一つのファイルにまとめたいです。
※日報データです。
 
そのまま結合すると、縦に結合されます。
横に結合する方法はあるのでしょうか?

回答
投稿日時: 23/07/06 17:02:44
投稿者: んなっと

表形式の具体例と欲しい結果を書いてください。
例えば E:\office\Excel\新しいフォルダー にある
 
5-5-1.csv
 
    A   B
1  開始  終了
2  8:15 10:00
3 12:50 17:00
4 19:00 21:30
 
5-5-2.csv
 
    A   B
1  開始  終了
2  8:20 10:05
3 12:55 17:05
4 19:05 21:35
 
などのファイルを次のように横方向に結合したい場合...
 
      A     B     C     D
1 5-5-1開始 5-5-1終了 5-5-2開始 5-5-2終了
2    8:15   10:00    8:20   10:05
3   12:50   17:00   12:55   17:05
4   19:00   21:30   19:05   21:35
 
 
 
新規ブックで
 [データ]
→[データの取得]
→[その他のデータソースから]
→[空のクエリ]
→詳細エディター
 
let
    ソース = ""
in
    ソース
 
を削除して以下の文字列に書き換え
 
 
let
    ソース = Folder.Files("E:\office\Excel\新しいフォルダー"),
    Del = Table.SelectColumns(ソース,{"Content", "Name"}),
    Add = Table.AddColumn(Del, "カスタム", each Csv.Document([Content])),
    Trs = Table.AddColumn(Add, "カスタム2" , each Table.PromoteHeaders([カスタム], [PromoteAllScalars=true])),
    Del2 = Table.SelectColumns(Trs,{"Name", "カスタム2"}),
    Ren = Table.TransformColumns(Del2, {{"Name", each Text.BeforeDelimiter(_, "."), type text}}),
    Exp = Table.ExpandTableColumn(Ren, "カスタム2", Table.ColumnNames(Ren[カスタム2]{0})),
    Unp = Table.UnpivotOtherColumns(Exp, {"Name"}, "属性", "値"),
    Cmb = Table.CombineColumns(Unp,{"Name", "属性"},Combiner.CombineTextByDelimiter("", QuoteStyle.None),"結合"),
    Grp = Table.Group(Cmb, {"結合"}, {{"グループ", each _, type table [結合=text, 値=text]}}),
    Idx = Table.AddColumn(Grp, "連番", each Table.AddIndexColumn([グループ], "連番", 1, 1)),
    Del3 = Table.SelectColumns(Idx,{"連番"}),
    Exp2 = Table.ExpandTableColumn(Del3, "連番", {"結合", "値", "連番"}),
    Piv = Table.Pivot(Exp2, List.Distinct(Exp2[結合]), "結合", "値"),
    Del4 = Table.RemoveColumns(Piv,{"連番"})
in
    Del4
 
 
→完了
→[ホーム]タブの[閉じて読み込む] 

投稿日時: 23/07/07 10:21:26
投稿者: まるえん

表形式の具体例と欲しい結果を書いてください。
⇒そうですね。わかりずらいですね・・・。
 申し訳ございません。
  
例 D:\日報 にあるCSVファイル 合計66ファイルあります。
  
A1_20230707.csv
  
    A    B    C    D    E
1    項目    あ    い    う    備考
2    タグ名    a    b    c    
3    1:00    1    2    3    
4    2:00    4    5    6    
〜                    
30    24:00    7    8    9    
31    最大値    7    8    9    
32    最小値    1    2    3    
33    平均値    7    8    9    
34    合計値    11    12    13    
 
  
A2_20230707.csv
  
    A    B    C    D    E
1    項目    え    お    か    備考
2    タグ名    d    e    f    
3    1:00    1    2    3    
4    2:00    4    5    6    
〜                    
30    24:00    7    8    9    
31    最大値    7    8    9    
32    最小値    1    2    3    
33    平均値    7    8    9    
34    合計値    11    12    13    
 
  
を横に結合して下記の様にしたいです。
※A列は共通、備考の列は削除したい。
     A    B    C    D    E    F    G
1    項目    あ    い    う    え    お    か
2    TAG    a    b    c    d    e    f
3    1:00    1    2    3    1    2    3
4    2:00    4    5    6    4    5    6
〜                            
30    24:00    7    8    9    7    8    9
31    最大値    7    8    9    7    8    9
32    最小値    1    2    3    1    2    3
33    平均値    7    8    9    7    8    9
34    合計値    11    12    13    11    12    13
 
 
教えて頂いた文で実行してみたところ
  
= Table.Pivot(Exp2, List.Distinct(Exp2[結合]), "結合", "値")
で下記の様なエラーがでました。
DataFormat.Error: 結果に予期されたより多くの列が含まれていました。
詳細:
    Count=1
  
以上でイメージ出来ますでしょうか?

回答
投稿日時: 23/07/07 13:54:32
投稿者: んなっと

重いかもしれない。
  
let
    ソース = Folder.Files("D:\日報"),
    Add = Table.AddColumn(ソース, "カスタム", each Csv.Document([Content])),
    Trs = Table.AddColumn(Add, "カスタム2" , each
        Table.RemoveColumns(Table.PromoteHeaders([カスタム], [PromoteAllScalars=true]),{"備考"})),
    Del = Table.SelectColumns(Trs,{"カスタム2"}),
    Idx=Table.AddIndexColumn(Del,"Index",0,1),
    Mrg=List.Accumulate(List.RemoveFirstN(Idx[Index],1),Idx[カスタム2]{0},(s, c) =>
        let
            Tbl=Table.NestedJoin(s, {"項目"}, Idx[カスタム2]{c}, {"項目"}, "Piv", JoinKind.LeftOuter),
            Exp=Table.ExpandTableColumn(Tbl, "Piv", List.RemoveFirstN(Table.ColumnNames(Tbl[Piv]{0}),1))
        in
            Exp)
in
    Mrg
 
  
別の方法。
  
let
    ソース = Folder.Files("D:\日報"),
    Add = Table.AddColumn(ソース, "カスタム", each Csv.Document([Content])),
    Trs = Table.AddColumn(Add, "カスタム2" , each Table.PromoteHeaders([カスタム], [PromoteAllScalars=true])),
    Del = Table.SelectColumns(Trs,{"カスタム2"}),
    Tbl = Table.SelectColumns(Del[カスタム2]{0},{"項目"}),
    Idx = Table.AddIndexColumn(Tbl, "インデックス", 1, 1, Int64.Type),
    TblExp=(t as table)=>
        let
            Tbl2=Table.RemoveColumns(t,{"備考"}),
            Unp = Table.UnpivotOtherColumns(Tbl2, {"項目"}, "属性", "値")
        in
            Unp,
    Add2 = Table.AddColumn(Trs, "カスタム3" , each TblExp([カスタム2])),
    Del2 = Table.SelectColumns(Add2,{"カスタム3"}),
    Exp = Table.ExpandTableColumn(Del2, "カスタム3", {"項目","属性", "値"}),
    Piv = Table.Pivot(Exp, List.Distinct(Exp[属性]), "属性", "値"),
    Mrg = Table.NestedJoin(Idx, {"項目"}, Piv, {"項目"}, "Piv", JoinKind.LeftOuter),
    Exp2 = Table.ExpandTableColumn(Mrg, "Piv", List.RemoveFirstN(Table.ColumnNames(Mrg[Piv]{0}),1)),
    Srt = Table.Sort(Exp2,{{"インデックス", Order.Ascending}}),
    Del3 = Table.RemoveColumns(Srt,{"インデックス"})
in
    Del3

投稿日時: 23/07/10 17:05:57
投稿者: まるえん

んなっとさん。 こんにちは。
せっかく、2種類の方法を考えていただいたのに
ファイルの構成違っていました。
大変申し訳ございません。
下記が正しいファイルになります。
※又、よくよく考えると、各ファイルのデータ項目が6〜14個とバラバラで後から
 データ項目が追加及び削除する可能性もあることから
 そのまま横に結合するのでは無く20列間隔で結合したいです。
 
 
A1_20230707.csv
   
    A    B    C    D    E
1    20230707                
2    ああ                
3                    
4    項目    あ    い    う    備考
5    タグ名    a    b    c    
6    1:00    1    2    3    
7    2:00    4    5    6    
8    〜                
9    24:00    7    8    9    
10    最大値    7    8    9    
11    最小値    1    2    3    
12    平均値    7    8    9    
13    合計値    11    12    13    
   
A2_20230707.csv
   
    A    B    C    D    E    F
1    20230707                    
2    いい                    
3                        
4    項目    え    お    か    き    備考
5    タグ名    d    e    f    g    
6    1:00    1    2    3    4    
7    2:00    4    5    6    7    
8    〜                    
9    24:00    7    8    9    7    
10    最大値    7    8    9    7    
11    最小値    1    2    3    1    
12    平均値    7    8    9    7    
13    合計値    11    12    13    11    
 
   
横に20列毎(各ファイルの先頭がA,U,AO〜)として結合したいです。
 
    A    B    C    D    E    〜    U    V    W    X    Y    Z
1    20230707                        20230707                    
2    ああ                        いい                    
3                                                
4    項目    あ    い    う    備考        項目    え    お    か    き    備考
5    タグ名    a    b    c            タグ名    d    e    f    g    
6    1:00    1    2    3            1:00    1    2    3    4    
7    2:00    4    5    6            2:00    4    5    6    7    
8    〜                        〜                    
9    24:00    7    8    9            24:00    7    8    9    7    
10    最大値    7    8    9            最大値    7    8    9    7    
11    最小値    1    2    3            最小値    1    2    3    1    
12    平均値    7    8    9            平均値    7    8    9    7    
13    合計値    11    12    13            合計値    11    12    13    11    
 
 
 
 
 

回答
投稿日時: 23/07/10 20:58:04
投稿者: んなっと

2回目の質問とだいぶ違いますね。信じられない...
 
let
    ソース = Folder.Files("D:\日報"),
    Add = Table.AddColumn(ソース, "カスタム", each Csv.Document([Content],
        [Delimiter=",", Columns=20, Encoding=932, QuoteStyle=QuoteStyle.None])),
    Trs = Table.AddColumn(Add, "カスタム2" , each
        Table.Transpose([カスタム])),
    Del = Table.SelectColumns(Trs,{"カスタム2"}),
    Exp = Table.ExpandTableColumn(Del, "カスタム2", Table.ColumnNames(Del[カスタム2]{0})),
    Trs2 = Table.Transpose(Exp)
in
    Trs2

投稿日時: 23/07/11 10:41:27
投稿者: まるえん

んなっとさん。こんにちは
データの情報の情報が間違っていたり、仕様を変更したにもかかわらず、
対応して頂き本当にありがとうございました。
思う通りの動作になっていました。
 
1行ずつ何をやっているのか、読みといて見たいと思います。
ありがとうございました。