首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将S3对象转换为层次(树)映射

将S3对象转换为层次(树)映射
EN

Stack Overflow用户
提问于 2022-09-11 17:48:19
回答 2查看 91关注 0票数 0

在这个任务中,我需要使用S3从AWS ExAws中提取对象,并以类似文件树的结构将其返回到前端。

ExAws.S3.list_objects("bucket-name", prefix: "folder-path") |> ExAws.request!返回的数据

代码语言:javascript
复制
%{
  body: %{
    contents: [
      %{key: "file1.svg"},
      %{key: "FolderA/file1.txt"},
      %{key: "FolderA/file2.txt"},
      %{key: "FolderB/Layer1/file1.csv"},
      %{key: "FolderB/Layer1/file2.csv"},
      %{key: "FolderB/Layer1/GroupA/file1.pdf"},
      %{key: "FolderB/Layer1/GroupB/file1.jpg"},
      %{key: "FolderB/Layer2/file1.png"}
    ]
  }
}

我要把它转换成这张地图。

代码语言:javascript
复制
%{
  "FolderA" => %{
    "file1.txt" => "FolderA/file1.txt",
    "file2.txt" => "FolderA/file2.txt"
  },
  "FolderB" => %{
    "Layer1" => %{
      "GroupA" => %{
        "file1.pdf" => "FolderB/Layer1/GroupA/file1.pdf"
      },
      "GroupB" => %{
        "file1.jpg" => "FolderB/Layer1/GroupB/file1.jpg"
      },
      "file1.csv" => "FolderB/Layer1/file1.csv",
      "file2.csv" => "FolderB/Layer1/file2.csv"
    },
    "Layer2" => %{"file1.png" => "FolderB/Layer2/file1.png"}
  },
  "file1.svg" => "file1.svg"
}

我找到了这个npm包,S3-树,但是它为每个‘文件夹’做了一个请求。我需要的只是纯粹的算法。

这些与蟒蛇有关:Python-如何将S3文件夹转换为JSON层次结构?S3-树。把这些转化成长生不老药会有帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-12 03:48:41

我在这里再次为长生药最被低估的特性Access行为做广告。

Access.key/2是你在这里的朋友。

代码语言:javascript
复制
data
|> get_in([:body, :contents, Access.all(), :key])
|> Enum.reduce(%{}, fn e, acc ->
  put_in(acc, Enum.map(String.split(e, "/"), &Access.key(&1, %{})), e)
end)

就这样。

票数 3
EN

Stack Overflow用户

发布于 2022-09-11 18:36:26

好的递归挑战

我对ex_aws_s3并不熟悉,所以可能已经有了一些功能,但下面是我的尝试:

代码语言:javascript
复制
defmodule S3Tree do
  def parse(data) do
    Enum.reduce(data.body.contents, %{}, fn %{key: full_path}, acc ->
      tree = traverse(String.split(full_path, "/"), full_path)
      merge(nil, acc, tree)
    end)
  end

  defp traverse([file], full_path), do: %{file => full_path}
  defp traverse([dir | rest], full_path), do: %{dir => traverse(rest, full_path)}

  defp merge(_key, map1, map2), do: Map.merge(map1, map2, &merge/3)
end

用法:

代码语言:javascript
复制
data = %{
  body: %{
    contents: [
      %{key: "file1.svg"},
      %{key: "FolderA/file1.txt"},
      %{key: "FolderA/file2.txt"},
      %{key: "FolderB/Layer1/file1.csv"},
      %{key: "FolderB/Layer1/file2.csv"},
      %{key: "FolderB/Layer1/GroupA/file1.pdf"},
      %{key: "FolderB/Layer1/GroupB/file1.jpg"},
      %{key: "FolderB/Layer2/file1.png"}
    ]
  }
}

S3Tree.parse(data)

输出:

代码语言:javascript
复制
%{
  "FolderA" => %{
    "file1.txt" => "FolderA/file1.txt",
    "file2.txt" => "FolderA/file2.txt"
  },
  "FolderB" => %{
    "Layer1" => %{
      "GroupA" => %{"file1.pdf" => "FolderB/Layer1/GroupA/file1.pdf"},
      "GroupB" => %{"file1.jpg" => "FolderB/Layer1/GroupB/file1.jpg"},
      "file1.csv" => "FolderB/Layer1/file1.csv",
      "file2.csv" => "FolderB/Layer1/file2.csv"
    },
    "Layer2" => %{"file1.png" => "FolderB/Layer2/file1.png"}
  },
  "file1.svg" => "file1.svg"
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73681443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档