【问题标题】:PowerShell and CSVsPowerShell 和 CSV
【发布时间】: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


【解决方案1】:

我认为这就是你要找的东西。你自己非常接近。 :) 您的最终输出将在output.txt

顶行(标题)用双引号括起来。请考虑坚持这一点,因为它将在不同的 cmdlet 和/或其他进程之间创建通用的“csv”格式,以便它们将 CSV 文件识别为通用的。

编辑:我之前按错误的顺序进行了排序,我已对其进行了调整:

$devices = Import-CSV 38488676.csv

foreach ($device in $devices)
{
    $date = $device.date_added -as [DateTime];
    $device.date_added = $date.ToString("M/d/yyyy")
    #this foreach could all be done in one line by itself...
    #but it's easier to visualize and understand when broken out more
}

$devices | Sort-Object {$_.date_added -as [datetime]} | Sort dev_address -Unique | Export-CSV -NoTypeInformation output.txt

这给了我以下输出:

"dev_address","date_added","comments","user_id","dev_name"
"00:01:02:03:04:0c","4/20/2013","NIC Manufacturer = Microsoft","bob","comp1"
"00:01:02:03:04:0a","6/5/2014","NIC Manufacturer = Microsoft","bob","comp1"
"00:01:02:03:04:0d","7/8/2015","NIC Manufacturer = Microsoft","bob","comp1"
"00:01:02:03:04:0e","6/3/2016","NIC Manufacturer = Microsoft","bob","comp1"

【讨论】:

  • 你太棒了!这很好用!最后一行我切换了排序对象和排序,因为它似乎是按 MAC 地址而不是日期排序。再次感谢,非常感谢您的帮助!
  • 小心 - 您要确定的是,您正在对 dev_address LAST 和 -Unique 开关进行排序。这就是删除重复项的内容。这也是我之前编辑它的原因,因为你执行它的顺序会影响你是保留最旧的还是最新的……不管怎样,我很高兴这成功了。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 2018-05-18
  • 2019-11-01
  • 2021-10-27
相关资源
最近更新 更多