Powershell:按日期重新排序文件中的行

时间:2013-04-19 05:23:13

标签: sorting powershell

我有一个这样的输入文件:

    彼得,墨尔本,1982年5月30日
    西蒙,悉尼,1990年2月21日
    汤姆,阿德莱德,1980年9月22日

我想做的是按日期列重新排序文件内容并将其保存到文件中。
像:

    汤姆,阿德莱德,1980年9月22日
    彼得,墨尔本,1982年5月30日
    西蒙,悉尼,1990年2月21日

整个事情应该在Powershell中完成..

干杯!

2 个答案:

答案 0 :(得分:4)

@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

答案 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