修改CSV文件并添加新的计算列?

时间:2017-12-11 20:08:44

标签: windows powershell csv

我有一个固定列数的CSV文件,第一个记录始终是列字段名称,后跟数据。我想为新列计算添加一个新的计算列 - 我想调用Invoke-WebRequest从现有字段传入数据并将返回的数据存储为附加字段值。

现有log.csv文件的示例:

date,time,User,Page,Client-IP,X-Forwarded-For,Server-IP
2017-12-11,16:54:48,user@domain.com,/owa/test.html,111.111.111.111,222.222.222.222,121.121.121.121
2017-12-11,16:54:48,user@domain.com,/owa/test.html,222.222.222.222,222.222.222.222,111.111.111.121

对于CSV文件中的每条记录,我想采用X-Forwarded-For字段数据并按如下方式调用Invoke-WebRequest

Invoke-WebRequest -Uri http://localhost:6779/json/222.222.222.222 |
    Select -Expand Content |
    ConvertFrom-Json |
    Select -ExpandProperty country_name

在上面的cmd中,222.222.222.222是第一条记录的X-Forwarded-For数据。返回的数据将是国家/地区名称。

我会想象代码是......

$GEOIP = Invoke-WebRequest -Uri http://localhost:6779/json/$($OWAHTTPLog).X-Forwarded-For |
         Select -Expand Content |
         ConvertFrom-Json |
         Select -ExpandProperty country_name
$OWAHTTPLog = Import-Csv C:\owalog.csv |
              Select *,@{Name='GEOIP-Country';Expression={"$GEOIP"}} |
              Export-Csv C:\audit.csv -NoTypeInformation

问题是,我需要从CSV中获取X-Forwarded-For的值,并将其作为Invoke-WebRequest传递给$IPAddress?如何在我的例子中做到这一点?

2 个答案:

答案 0 :(得分:1)

只需使用您想要在calculated property的表达式中派生新列值的属性:

Import-Csv 'C:\owalog.csv' |
    Select *,@{n='GEOIP-Country';e={
        $uri = 'http://localhost:6779/json/{0}' -f $_.'X-Forwarded-For';
        (Invoke-WebRequest -Uri $uri).Content | ConvertFrom-Json |
            Select -ExpandProperty country_name
    }} |
    Export-Csv 'C:\audit.csv' -NoType

答案 1 :(得分:1)

其他方法:

import-csv 'C:\owalog.csv' | %{
$row=$_
$uri = 'http://localhost:6779/json/{0}' -f $row.'X-Forwarded-For';
$Result=(Invoke-WebRequest -Uri $uri).Content | ConvertFrom-Json | Select -ExpandProperty country_name
$row | Add-Member -Name 'GEOIP-Country' -Value $Result -MemberType NoteProperty
$row

} | Export-Csv 'C:\audit.csv' -NoType