Powershell 从特定CSV列计算并输出到新文件
我正试图从一个CSV文件导入数据,用导入的数据进行一些计算,然后将其保存到一个新的CSV文件,而我在过去的一天里一点运气都没有 总结: 我有一个用数据列分隔的CSV管道: 可乐,可乐,可乐,冷,可乐 colA是字符串格式的日期时间“20/01/2011 14:20:00”(dd/MM/yyyy HHmmss) colC是一个数字 我需要读取初始CSV,然后根据colA中的值进行两次计算: 1-自2000年1月1日起的天数,以及 2-从午夜开始的分钟数 DATA.csv中的示例数据:Powershell 从特定CSV列计算并输出到新文件,powershell,csv,Powershell,Csv,我正试图从一个CSV文件导入数据,用导入的数据进行一些计算,然后将其保存到一个新的CSV文件,而我在过去的一天里一点运气都没有 总结: 我有一个用数据列分隔的CSV管道: 可乐,可乐,可乐,冷,可乐 colA是字符串格式的日期时间“20/01/2011 14:20:00”(dd/MM/yyyy HHmmss) colC是一个数字 我需要读取初始CSV,然后根据colA中的值进行两次计算: 1-自2000年1月1日起的天数,以及 2-从午夜开始的分钟数 DATA.csv中的示例数据: 01/01/
01/01/2011 14:20:00|10|6|10|192.168.11.7|
01/01/2011 14:25:00|2|0|10|192.168.11.7|
01/01/2011 14:30:00|4|8|10|192.168.11.7|
01/01/2011 14:35:00|6|9|10|192.168.11.7|
然后,我需要将计算出的数据输出到一个新的CSV文件,该文件还添加了一些硬编码的值/列(原始dta,无标题):
(自2000年1月1日起的天数),(从午夜开始的分钟数),5,(colC值),1,文本,A,0
**括号中的值是从原始CSV计算/或传递的。所有其他值都硬编码到每个CSV行中
因此,对于上面的示例数据,新的输出将是(同样,出于格式化目的,我添加了额外的换行符):
我可以将字段解析为如下数组:
$data = Import-Csv c:\data.csv -Header colA, colB, colC, colD, colE -Delimiter '|' | Select-Object colA, colC
$newdata += $data
$newdata | convertto-csv -NoTypeInformation -Delimiter ',' | foreach-object {$_} | Out-File c:\newfile.csv
这会给我两个我想要的字段,但我无法执行计算并在新的CSV中添加所需的额外硬编码字段
在过去的一天里,我一直在谷歌上搜索并尝试许多不同的方法,但我仍然一事无成
有人能提供一些帮助吗?谢谢。像这样的事情应该会让你开始
$path = "E:\temp\sample.csv"
$y2k = Get-Date -Date 1/1/2000
Import-Csv $path -Header colA, colB, colC, colD, colE -Delimiter '|' | ForEach-Object{
$colADate = [datetime]::ParseExact($_.ColA,"dd/MM/yyyy HH:mm:ss",[System.Globalization.CultureInfo]::InvariantCulture)
$minutesFromMidnight = $colADate.TimeOfDay.TotalMinutes
$daysSincey2k = New-TimeSpan -Start $y2k -End $colADate | Select-Object -ExpandProperty Days
[PSCustomObject][ordered]@{
DaysSince = $daysSincey2k
MinutesSince = $minutesFromMidnight
ColA = $_.Cola
ColB = $_.Colb
ColC = $_.Colc
ColD = $_.Cold
ColE = $_.Cole
}
}
您可以使用Select Object
表达式将其设置为一行,但这应该更易于阅读。您至少需要PowerShell 3.0才能使其正常工作。如果你没有它,这将只需要轻微的调整。这是数据的输出
DaysSince MinutesSince ColA ColB ColC ColD ColE
--------- ------------ ---- ---- ---- ---- ----
4018 860 01/01/2011 14:20:00 10 6 10 192.168.11.7
4018 865 01/01/2011 14:25:00 2 0 10 192.168.11.7
4018 870 01/01/2011 14:30:00 4 8 10 192.168.11.7
4018 875 01/01/2011 14:35:00 6 9 10 192.168.11.7
如果使用方法ParseExact
将时间转换为DateTime
对象,则所有时间的格式都相同。这允许我们使用newtimespan
确定时间差。使用计算字段创建自定义对象并添加计算数据
根据评论更新
对于您正在寻找的静态输出,我将更改[pscustomobject]
如下,并添加一个导出csv调用
[PSCustomObject][ordered]@{
DaysSince = $daysSincey2k
MinutesSince = $minutesFromMidnight
Five = 5
ColC = $_.Colc
One = 1
Text = "Text"
Bee = "B"
Zero = 0
}
} | Export-Csv -Path c:\newfile.csv -NoTypeInformation
对于2.0来说,这应该是可行的
$props = @{
DaysSince = $daysSincey2k
MinutesSince = $minutesFromMidnight
Five = 5
ColC = $_.Colc
One = 1
Text = "Text"
Bee = "B"
Zero = 0
}
New-Object PSObject -Property $props
} | Select-Object DaysSince,MinutesSince,Five,ColC,One,Text,Bee,Zero | Export-Csv -Path c:\temp\newfile.csv -NoTypeInformation
请为输入和所需输出添加一些示例数据。示例数据添加到上述主体中。。请原谅为保留格式而强制换行。我为您@gizmomelb修复了它。现在我可以用你的数据尝试我的答案谢谢你的建议/example@Matt我如何将Colc、DaysSince和minutesince导出/保存到一个新文件?所以导出格式是:DaysSince,MinutesSince,5,ColC,1,Text,B,0谢谢。@gizmomelb更新了数据作为输入。看一看谢谢@Matt-有些对我来说甚至是有意义的,所以非常感谢你的帮助。但是我想将DaysSince、MinutesSince和colC值保存到一个新的CSV文件中,该文件的每一行都添加了一些硬编码字段——请问我该如何处理?谢谢。@gizmomelb请看一下粗体部分。谢谢你,谢谢你是一名优秀的教师-我只是在搜索,想问我是否需要使用“导出CSV”命令。我不知道你可以硬编码数组中的值,因为它被保存为CSV格式。再次感谢您的帮助和时间。
$props = @{
DaysSince = $daysSincey2k
MinutesSince = $minutesFromMidnight
Five = 5
ColC = $_.Colc
One = 1
Text = "Text"
Bee = "B"
Zero = 0
}
New-Object PSObject -Property $props
} | Select-Object DaysSince,MinutesSince,Five,ColC,One,Text,Bee,Zero | Export-Csv -Path c:\temp\newfile.csv -NoTypeInformation