我在 foreach 中又加了一个 if 语句。结果是一行一个数字的列表。示例:
3
2824
28
6374
3887
198
1953
3827
我希望将其作为变量的结果:
"watchers": ["3", "2824", "28", "6374", "3887", "198", "1953", "3827"],
我目前还不知道如何将 foreach 结果转换为示例字符串。我更喜欢 Powershell,但我可以使用几乎任何语言。
编辑:重新表述我的问题,和/或更具体地说,我有这个 CSV
user_id,ticket_id
253,24704
1257,24201
1257,17038
1257,22560
1257,22547
1925,24783
2452,24766
2452,24787
2453,24766
2453,24787
我正在尝试编写一个脚本来为我创建这个 JSON:
[{
“ticket_id”: “253”,
“watchers”: [“24704”]
}, {
“ticket_id”: “1257”,
“watchers”: [“24201”, “17038”,“22560”,“22547”]
}, {
“ticket_id”: “1925”,
“watchers”: [“24783”]
}, {
“ticket_id”: “2452”,
“watchers”: [“24766”,“24787”]
}, {
“ticket_id”: “2453”,
“watchers”: [“24766”,“24787”]
}
]
您似乎想要的是一个 Json 字符串,其中有一个名为的属性
watchers
,其值是一个数字数组,在这种情况下手动构造它是错误的,您可以使用ConvertTo-Json
,例如:如果您想要与所讨论的输出完全相同的内容并且想要手动构造字符串,则可以先用分隔符连接数字数组
", "
,然后在新字符串中插入该字符串:根据评论并查看您问题的最后一次编辑,假设 CSV 在文件中,您可以
Group-Object
使用user_id
:使用示例 CSV 的上述输出将是:
如果名为的文件
C:\Test\file.txt
包含以下内容:您可以按如下方式编写 PowerShell 来获取结果输出:
结果是
使用的PowerShell版本是7.4.5。
值得一提的是,PowerShell 有三种不同的
ForEach
es。您应该使用最有意义的那个。有命令式的语言结构
ForEach ($var in list) { ... }
:然后是
ForEach-Object
,可以缩写为 justForEach
(或者%
在提示符下缩写为 ,以便快速输入一行代码),它用于管道;它相当于map
函数式语言中的原语:最后,集合类型有一个
ForEach
方法,您可以使用代码块调用该方法来为每个项目运行:所有这些都返回结果列表,尽管命令式语句并不总是可以用作表达式;例如,您不能将其放在括号中。这在语法上限制了它的可嵌入性。
但是,无论你使用哪一个,它们都不知道“行”是什么;它们只是生成一个列表。当然,如果你不对该列表执行任何操作,那么 PowerShell 默认会将其打印到你的终端,每行一个元素。但这是在完成之后
ForEach
,PowerShell 对任何列表都执行相同的操作,包括你在提示符下简单输入的文字列表:由于
ForEach
返回一个列表,您可以直接将其分配给一个变量:但是该变量的值仍然是一个列表,而不是方括号中的引号值的字符串。
看起来您想要的是对象的 JSON 表示形式(在 PowerShell 中是关联数组/哈希表),该对象具有“watchers”属性,其值是字符串列表。您可以轻松创建这样的对象:
上面我使用了另一个 ForEach(
ForEach-Object
别名为%
)将输入列表中的每个数字转换为字符串;更改在 PowerShell 的默认输出中不可见,但会在生成的 JSON 中以引号的形式产生差异。将其.ToString()
作为原始循环主体的一部分进行调用会更有意义;由于您没有分享该代码,因此我没有展示这一点。无论如何,一旦您有了对象,您就可以将其转换为 JSON,如下所示:
当然,你可以一次性完成所有操作,不需要中间变量: