Arraylist Elixir-操纵二维列表

Arraylist Elixir-操纵二维列表,arraylist,types,elixir,Arraylist,Types,Elixir,希望每个人都有一个美好的2019年,即使我们只是一天 我目前正在开发一个小型的Phoenix应用程序,其中我正在处理PDF文件(在这个问题中,我正在拆分它们),然后将它们上传到S3。稍后,我必须删除由pdftk(一个pdf工具)创建的临时文件,我使用它来分割它们,并且在响应体中显示s3链接,因为这是一个API请求 我的结构方式如下: 在我的拆分模块中,核心业务逻辑是: filenames = [] s3_links = [] Enum.map(pages, fn(item) ->

希望每个人都有一个美好的2019年,即使我们只是一天

我目前正在开发一个小型的Phoenix应用程序,其中我正在处理PDF文件(在这个问题中,我正在拆分它们),然后将它们上传到S3。稍后,我必须删除由pdftk(一个pdf工具)创建的临时文件,我使用它来分割它们,并且在响应体中显示s3链接,因为这是一个API请求

我的结构方式如下:

在我的
拆分
模块中,核心业务逻辑是:

filenames = []
 s3_links = []
 Enum.map(pages, fn(item) ->
        split_filename = item
          |> split(filename)
        link = split_filename
          |> FileHelper.result_file_bytes()
          |> ManageS3.upload()
          |> FileHelper.save_file(work_group_id, pass)

        [filenames ++ split_filename, s3_links ++ link]
      end)
      |> transform()
    {filenames, s3_links}
最重要的是拆分文件名和链接 这是我在transform()方法中调用IO.inspect时得到的结果:

结构是
[[filename,s3\u link],[filename,s3\u link]
,而期望的结果是
[[list of all filename],[list of s3 link]


如果有人能伸出援助之手,我会非常感激。谢谢。

< P>而不是在列表中工作,你可能想考虑用列表来使用元组。像下面这样的事情应该对你有用。

List.foldl(pages, {[], []}, fn(item, {filenames, links}) ->
  filename = split(item, filename)

  link =
    file_name
    |> FileHelper.result_file_bytes()
    |> ManagerS3.upload()
    |> FileHelper.save_file(work_group_id, pass)

  {[filename | filenames], [link | links]}
end)
这将返回一个如下所示的值

{
  ["87cdcd73-5b27-4757-a472-78aaf6cc6864.pdf",
   "0ab460ca-5019-4864-b0ff-343966c7d72a.pdf"],

  ["Some_S3_LINK00",
   "Some_S3_LINK01"]
}
不过,根据您使用这些值的方式,可能更适合使用元组列表

Enum.map(pages, fn(item) ->
  filename = split(item, filename)

  link =
    filename
    |> FileHelper.result_file_bytes()
    |> ManageS3.upload()
    |> FileHelper.save_file(work_group_id, pass)

  {filename, link}
end)
会回来吗

[
  {"87cdcd73-5b27-4757-a472-78aaf6cc6864.pdf", "Some_S3_LINK00"},
  {"0ab460ca-5019-4864-b0ff-343966c7d72a.pdf", "Some_S3_LINK01"}
]

<> >而不是在列表列表上工作,您可能想考虑使用列表来使用元组。
List.foldl(pages, {[], []}, fn(item, {filenames, links}) ->
  filename = split(item, filename)

  link =
    file_name
    |> FileHelper.result_file_bytes()
    |> ManagerS3.upload()
    |> FileHelper.save_file(work_group_id, pass)

  {[filename | filenames], [link | links]}
end)
这将返回一个如下所示的值

{
  ["87cdcd73-5b27-4757-a472-78aaf6cc6864.pdf",
   "0ab460ca-5019-4864-b0ff-343966c7d72a.pdf"],

  ["Some_S3_LINK00",
   "Some_S3_LINK01"]
}
不过,根据您使用这些值的方式,可能更适合使用元组列表

Enum.map(pages, fn(item) ->
  filename = split(item, filename)

  link =
    filename
    |> FileHelper.result_file_bytes()
    |> ManageS3.upload()
    |> FileHelper.save_file(work_group_id, pass)

  {filename, link}
end)
会回来吗

[
  {"87cdcd73-5b27-4757-a472-78aaf6cc6864.pdf", "Some_S3_LINK00"},
  {"0ab460ca-5019-4864-b0ff-343966c7d72a.pdf", "Some_S3_LINK01"}
]
旁注:

  • 一开始分配
    filenames=[];s3_links=[]
    毫无意义。
    Enum.map
    已经映射了输入。您需要的可能是
  • 当管道包含唯一调用时,不要使用管道
    操作符,Elixir核心团队认为它是反模式的
  • 始终以术语开头

  • 解决方案:

    使用直接将结果中的输入减少到您需要的程度

    页面
    |>Enum.reduce([[],[]],fn项,[文件,链接]]>
    拆分\文件名=拆分(项目,文件名)
    链接=
    分割文件名
    |>FileHelper.result\u file\u bytes()
    |>ManageS3.upload()
    |>FileHelper.save_文件(工作组id,通过)
    [[split_filename | files],[link | links]]
    (完)
    |>Enum.map(&Enum.reverse/1)
    |>IO.检查(标签:“转换前”)
    |>变换()
    
    您没有提供测试它的输入,但我相信它应该可以工作。

    旁注:

  • 一开始分配
    filenames=[];s3_links=[]
    毫无意义。
    Enum.map
    已经映射了输入。您需要的可能是
  • 当管道包含唯一调用时,不要使用管道
    操作符,Elixir核心团队认为它是反模式的
  • 始终以术语开头

  • 解决方案:

    使用直接将结果中的输入减少到您需要的程度

    页面
    |>Enum.reduce([[],[]],fn项,[文件,链接]]>
    拆分\文件名=拆分(项目,文件名)
    链接=
    分割文件名
    |>FileHelper.result\u file\u bytes()
    |>ManageS3.upload()
    |>FileHelper.save_文件(工作组id,通过)
    [[split_filename | files],[link | links]]
    (完)
    |>Enum.map(&Enum.reverse/1)
    |>IO.检查(标签:“转换前”)
    |>变换()
    

    您没有提供用于测试它的输入,但我相信它应该可以工作。

    使用List.foldl的想法看起来很棒。我的主要问题是试图找到一种以某种方式使用枚举函数的方法。例如Enum.map()、Enum.each()。对于不将OOP思想应用于Elixir仍然是绿色的。至于元组思想:制作元组列表有好处吗?我需要将文件名和s3链接分开的原因是,我可以将s3链接作为数组返回到响应体中,然后使用文件名手动清除调用pdftk操作。@StiliyanHristov元组只会使访问数组中的每个项变得更容易。但父项仍然是一个数组。听起来不错。但我需要它们以数组形式出现,因为我有不同的函数()在完成所有操作后删除所有文件,他们希望有一个列表。不过,我以后会记住这一点。谢谢:)使用list.foldl的想法看起来很棒。我的主要问题是试图找到一种以某种方式使用枚举函数的方法。例如Enum.map(),Enum.each()。对于不将OOP思想应用于Elixir仍然是绿色的。至于元组思想:制作元组列表有好处吗?我需要将文件名和s3链接分开的原因是,我可以将s3链接作为数组返回到响应体中,然后使用文件名手动清除调用pdftk操作。@StiliyanHristov元组只会使访问数组中的每个项变得更容易。但父项仍然是一个数组。听起来不错。但我需要它们以数组形式出现,因为我有不同的函数()这会在完成所有操作后删除所有文件,他们希望有一个列表。不过,我以后会记住这一点。谢谢:)谢谢你的描述性回答,这也很有效。我只需要添加一个对Enum.reverse()的调用由于输入需要按照我接收它们的顺序进行,因此我们将它们添加到列表“[[split_filename | files],[link | links]”的
    标题中
    。你在
    1上完全正确。`我不需要它们。你能详细说明一下
    2点。
    当管道仅由呼叫组成时,你的意思是什么?谢谢,干杯:)当链中只有一个管道操作员时,它不是管道。do
    Mod.fun(arg)
    not
    arg|>Mod.fun()
    。谢谢你的描述性回答,这也行得通。我只需要添加一个对Enum.reverse()的调用