Arraylist Elixir-操纵二维列表
希望每个人都有一个美好的2019年,即使我们只是一天 我目前正在开发一个小型的Phoenix应用程序,其中我正在处理PDF文件(在这个问题中,我正在拆分它们),然后将它们上传到S3。稍后,我必须删除由pdftk(一个pdf工具)创建的临时文件,我使用它来分割它们,并且在响应体中显示s3链接,因为这是一个API请求 我的结构方式如下: 在我的Arraylist Elixir-操纵二维列表,arraylist,types,elixir,Arraylist,Types,Elixir,希望每个人都有一个美好的2019年,即使我们只是一天 我目前正在开发一个小型的Phoenix应用程序,其中我正在处理PDF文件(在这个问题中,我正在拆分它们),然后将它们上传到S3。稍后,我必须删除由pdftk(一个pdf工具)创建的临时文件,我使用它来分割它们,并且在响应体中显示s3链接,因为这是一个API请求 我的结构方式如下: 在我的拆分模块中,核心业务逻辑是: filenames = [] s3_links = [] Enum.map(pages, fn(item) ->
拆分
模块中,核心业务逻辑是:
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点。
当管道仅由呼叫组成时,你的意思是什么?谢谢,干杯:)当链中只有一个管道操作员时,它不是管道。doMod.fun(arg)
notarg|>Mod.fun()
。谢谢你的描述性回答,这也行得通。我只需要添加一个对Enum.reverse()的调用