我有一个这样的输入文件:
Peter,Melbourne,30.5.1982
Simon,Sydney,21.2.1990
Tom,Adelaide,22.9.1980
我想做的是按日期列重新排序文件的内容并将其保存到文件中。
喜欢:
汤姆,阿德莱德,22.9.1980
彼得,墨尔本,30.5.1982
西蒙,悉尼,21.2.1990
整个事情应该在Powershell中完成..
干杯!
我有一个这样的输入文件:
Peter,Melbourne,30.5.1982
Simon,Sydney,21.2.1990
Tom,Adelaide,22.9.1980
我想做的是按日期列重新排序文件的内容并将其保存到文件中。
喜欢:
汤姆,阿德莱德,22.9.1980
彼得,墨尔本,30.5.1982
西蒙,悉尼,21.2.1990
整个事情应该在Powershell中完成..
干杯!
@vonPryz 给出了一个很好的答案,你可以做得更短一点。
# Read input data
$c = Import-Csv -Header @("Name","City","Date") c:\temp\data.txt -Delimiter ","
# Get the good globalization info
$oz = new-object Globalization.CultureInfo("en-AU")
#
$c | Sort-Object {[System.DateTime]::Parse($_.date, $oz)}
# Write output data
$d | Export-Csv c:\temp\datasSortedVyDate.csv -NoTypeInformation
用于Import-CSV
读取数据。然后将每个日期转换为 DateTime 对象,因此排序将比较日期,而不是字符串。最后,按日期列对 CSV 数据进行排序。像这样,
# Read input data
$c = Import-Csv -Header @("Name","City","Date") c:\temp\data.txt -Delimiter ","
# Print the data. This looks just like what we have read from the file
$c
Name City Date
Peter Melbourne 30.5.1982
Simon Sydney 21.2.1990
Tom Adelaide 22.9.1980
让我们对数据进行排序
$c | sort -Property Date
Name City Date
Simon Sydney 21.2.1990
Tom Adelaide 22.9.1980
Peter Melbourne 30.5.1982
嗯?排序不起作用。这是因为 Date 列包含字符串值。在字符串排序中,排序不关心年份部分,因为两个前字符足以对字符串进行排序。这是一个常见的警告。
如何克服这一点?需要将日期转换为日期对象,这些对象也可以通过比较年份和月份部分来很好地排序。首先,创建一个文化信息,用于判断您使用的是 mm-dd-yyyy、dd-mm-yyyy 还是其他格式。
# Eh, mate, Melbourne is down under
$oz = new-object Globalization.CultureInfo("en-AU")
# Loop through each row and convert the date member to date, using Aussie culture.
for($i=0;$i -ne $c.count; $i++) {
$c[$i].Date = [Convert]::ToDateTime($c[$i].Date, $oz)
}
# Now the sort works as expected:
$c | sort -Property Date
Name City Date
Tom Adelaide 22.9.1980 0:00:00
Peter Melbourne 30.5.1982 0:00:00
Simon Sydney 21.2.1990 0:00:00