Powershell 从特定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/

我正试图从一个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/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