【发布时间】:2016-09-15 03:20:02
【问题描述】:
我家里有一个媒体服务器,我创建了一个脚本,它可以提取所有文件名并在将它们放入 CSV 之前对其进行排序。我唯一的问题是它对字母数字进行排序,但从电影标题的角度来看,我想忽略“A”、“An”和“The”。有没有办法忽略这些字符串并在不实际更改 CSV 中的文件名的情况下正常进行排序?
【问题讨论】:
标签: sorting powershell csv
我家里有一个媒体服务器,我创建了一个脚本,它可以提取所有文件名并在将它们放入 CSV 之前对其进行排序。我唯一的问题是它对字母数字进行排序,但从电影标题的角度来看,我想忽略“A”、“An”和“The”。有没有办法忽略这些字符串并在不实际更改 CSV 中的文件名的情况下正常进行排序?
【问题讨论】:
标签: sorting powershell csv
是的,您可以按任何属性对多个对象进行排序,如果没有一个属性是您想要的,那么您可以向Sort-Object 提供一个脚本块,其中包含一些代码“对每个对象执行 xyz”,它会根据脚本块的输出对它们进行排序——这只会用于排序,不会改变任何东西。
因此,使用您想要的任何代码计算不带前导词A, An, The 的名称。在这里,我正在使用正则表达式进行烹饪,因为它快速、美味并且默认情况下会进行不区分大小写的匹配:
Get-ChildItem | Sort-Object -Property { $_.Name -replace '^(A|An|The).' }
但是你可以用厨房周围的简单食材做一些同样有效的事情:
Function Mangle-FilmName
{
param($file)
$name = $file.Name.ToLower()
if ($name.startswith('an'))
{
$name.Substring(4)
}
elseif ($name.startswith('the')
{
$name.Substring(5)
}
...
else
{
$name
}
}
Get-ChildItem | Sort-Object -Property Mangle-FilmName
或者使用switch 语句或在单词数组上循环,和/或/等等。
【讨论】:
'^(A |An |The )' - 不过?或者甚至这个 - '^(A *|An *|The *)'
'^(A|An|The) ' 但忘了把空格放在最后。我已将其编辑为 .,因此它将匹配任何后续字符,从 DAXaholic 中窃取了它可能是 the_name_here.mpg 之类的名称而不是空格的想法。
Attack of the clones 之类的电影名称与中间的the 分开,因为在中间忽略短词进行排序对我来说似乎很奇怪。但谁知道呢,没有例子就意味着一个模糊的答案。
'^(A |An |The )'
您可以使用以下内容。
由于缺少示例数据,我不知道您的文件名的结构(单词分隔符等),但您可以根据需要自定义以下代码。代码本质上是通过分隔符'_'、' ' 和'.' 拆分基本文件名,过滤掉您忽略的单词('The'、'A'、'An' 等)并重新连接这些部分到单个字符串。
请注意,在此结束时,文件名在没有初始单词分隔符的情况下进行比较(即'The_Blue_House.mpg' 和'The.Blue.House.mpg' 将被视为相同),恕我直言,这是一件好事,但您的需求可能会有所不同。
希望有帮助
$wordSeparator = '_| |\.'
$ignoredWords = @(
'The'
'A'
'An'
# add more
)
filter sortableFileName {
($_ -split $wordSeparator | ? { $_ -notin $ignoredWords }) -join ''
}
Get-ChildItem | Sort-Object { $_.BaseName | sortableFileName } # | Export-CSV
【讨论】: