1

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

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中完成..

干杯!

4

2 回答 2

5

@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
于 2013-04-19T07:20:43.783 回答
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
于 2013-04-19T06:31:02.417 回答