我有一个这样的输入文件:
彼得,墨尔本,1982年5月30日
西蒙,悉尼,1990年2月21日
汤姆,阿德莱德,1980年9月22日
我想做的是按日期列重新排序文件内容并将其保存到文件中。
像:
汤姆,阿德莱德,1980年9月22日
彼得,墨尔本,1982年5月30日
西蒙,悉尼,1990年2月21日
整个事情应该在Powershell中完成..
干杯!
答案 0 :(得分:4)
# 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
答案 1 :(得分:3)
使用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