【发布时间】:2016-07-20 18:56:05
【问题描述】:
下午好。我希望我能够获得一些我正在编写脚本以维护 CSV 文件的 PowerShell 的帮助。这个文件最大的问题是日期格式会通过添加到文件的系统发生变化。我的目标是能够运行此脚本,让它将所有日期更改为 MM/dd/yyyy,从最旧到最新(按日期)排序,然后搜索重复的地址并保留最旧的。
我有一点点开始,但我有点卡住了。我也做了很多(我相信是)很多不必要的文件创建,并且使这些事情过于复杂。我是 PowerShell 的新手,而且一般都在编写脚本。
这是我的数据的样子(注意第一行没有引号,输出应该保持不变)。这是一个 txt 文件,但读起来像 CSV。
dev_address,date_added,comments,user_id,dev_name
"00:01:02:03:04:0a","05/19/2014","NIC Manufacturer = Microsoft","bob","comp1"
"00:01:02:03:04:0b","05/19/2014","NIC Manufacturer = Microsoft","bob","comp1"
"00:01:02:03:04:0c","05/19/2013","NIC Manufacturer = Microsoft","bob","comp1"
"00:01:02:03:04:0d","2015/7/8","NIC Manufacturer = Microsoft","bob","comp1"
"00:01:02:03:04:0e","2016/06/03","NIC Manufacturer = Microsoft","bob","comp1"
这是我目前所写的:
$devList = Import-Csv .\TestFile.txt
$a = Get-Content .\TestFile.txt -TotalCount 1
Add-Content -Path '.\foo2.txt' -Value "$a"
$countList = -1
ForEach($devList in $devList)
{
$devMAC = $devList.dev_address
$devDate = $devList.date_added
$devComm = $devList.comments
$devUser = $devList.user_id
$devMName = $devList.dev_name
$devDate = ([datetime]($devDate)).ToString('MM/dd/yyyy')
Add-Content -Path '.\foo2.txt' -Value """$devMAC"",""$devDate"",""$devComm"",""$devUser"",""$devMName"""
}
Import-Csv '.\foo2.txt' | Sort-Object {[datetime]$_.date_added} | Export-Csv -NoTypeInformation '.\foo3.txt'
现在我知道这很混乱。所以我会尝试解释我在做什么。导入 CSV 文件。将 CSV 文件的第一行(标题)保存到一个变量中,以便我可以稍后将其原封不动地弹出到最终文件中。接下来,将每条记录的数据导入到变量中,以便将它们输入到最终文件中。我有点弄清楚日期的事情了。这似乎将日期更改为正确的格式,然后倒数第二行将其写入 $devList 中每个条目的文件。最后一行是导入第二个文件,按日期排序并导出到第三个最终文件。主要用于故障排除目的是多余的。不打算拥有 3 个文件。
导入数据的最佳方法是什么,将日期格式化为 MM/dd/yyyy,按最旧到最新排序,然后根据 dev_address 删除重复记录(但保留最旧的记录),然后导出到一个新文件,包括没有引号的 CSV 标头?
提前谢谢你:-)
编辑:
抱歉,我应该包含所需的输出。假设我有这个文件:
dev_address,date_added,comments,user_id,dev_name
"00:01:02:03:04:0a","05/19/2014","NIC Manufacturer = Microsoft","bob","comp1"
"00:01:02:03:04:0a","06/05/2014","NIC Manufacturer = Microsoft","bob","comp1"
"00:01:02:03:04:0c","04/20/2013","NIC Manufacturer = Microsoft","bob","comp1"
"00:01:02:03:04:0d","2015/7/8","NIC Manufacturer = Microsoft","bob","comp1"
"00:01:02:03:04:0e","2016/06/03","NIC Manufacturer = Microsoft","bob","comp1"
这是我想要的输出:
dev_address,date_added,comments,user_id,dev_name
"00:01:02:03:04:0c","04/20/2013","NIC Manufacturer = Microsoft","bob","comp1"
"00:01:02:03:04:0a","05/19/2014","NIC Manufacturer = Microsoft","bob","comp1"
"00:01:02:03:04:0d","07/08/2015","NIC Manufacturer = Microsoft","bob","comp1"
"00:01:02:03:04:0e","06/03/2016","NIC Manufacturer = Microsoft","bob","comp1"
如您所见,日期已固定且已排序,已删除多余的 dev_address 并保留了最早的日期。顶线保持不变。
【问题讨论】:
-
如果您可以手动形成预期输出的示例(而不是我们必须解析措辞),如果您可以将edit 放入问题中以使其更容易,这将有所帮助。跨度>
-
抱歉,感谢您的回复。我编辑了我的原始帖子以说明我的目标。
-
知道了。现在,这给我带来了一些您可能需要考虑澄清的问题:1) 您的原始数据集可以被格式化为几种可能的日期/时间格式?您是否有一组“已知”的可能性,还是我们需要准备好处理任何格式,还是放弃? 2) 在您的示例输出中,您保留了冗余的 oldest MAC 地址。是对的吗?从您的角度来看,我现在可以理解您为什么要在多个文件中进行多次运行。 :-( 哎呀。
-
感谢您的帮助,非常感谢。不幸的是,是的,数据集可能包含多种日期格式。老实说,我想我除了 yyyy/MM/dd 之外什么都没看到。能够处理任何事情都会很好。我想保留最旧的冗余 MAC。好吧,也许我离得不远?我正在考虑将数据导入数组并进行修改,这样我就不会有这么多“临时”文件,然后写回原始文件。
标签: csv powershell