Powershell,循环访问CSV文件并连续搜索字符串,然后导出

时间:2018-06-01 18:30:31

标签: powershell csv

我在服务器上有一个名为'servername'的目录。在该目录中,我有子目录,其名称是日期。在那些日期目录中,我有大约150个.csv文件审核日志。  我有一个部分工作的脚本,从日期目录内部开始,枚举并循环遍历.csv并在列中搜索字符串。我试图让它为每个匹配导出行,然后继续下一个文件。

$files = Get-ChildItem '\\servername\volume\dir1\audit\serverbeingaudited\20180525'

ForEach ($file in $files) {
    $Result = If (import-csv $file.FullName | Where {$_.'path/from' -like "*01May18.xlsx*"})
    {
    $result | Export-CSV -Path c:\temp\output.csv -Append}
    }

我正在做的是在'path \ from'列中搜索字符串 - 比如文件名。该列包含的数据总是某种形式的\ folder \ folder \ folder \ filename.xls。我正在搜索特定文件名以及该文件中该列中该文件名的所有实例。

我的问题是导出该行 - export.csv始终为空。我也喜欢启动目录'up'并浏览每个日期目录,解析,导出,然后继续下一个目录和文件。

如果我将其分解为一个文件并将其从IF中取出它似乎给了我一个结果,所以我认为我在IF或For-each中出现了问题,但显然是在我的薪资之上 - 不能算出来出....

预先感谢您的任何帮助, RichardX

3 个答案:

答案 0 :(得分:1)

问题在于您的def gp(s): gradhash = { "A+": 4.0 + 0.3 ,"A": 4.0 ,"A-": 4.0 - 0.3 ,"B+": 3.0 + 0.3 ,"B": 3.0 ,"B-": 3.0 - 0.3 ,"C+": 2.0 + 0.3 ,"C": 2.0 ,"C-": 2.0 - 0.3 ,"D+": 1.0 + 0.3 ,"D": 1.0 ,"D-": 1.0 - 0.3 } return gradhash[s] print(gp('A-')) 阻止,当您说If您说新$Result = If () {$Result | ...}与if语句返回的内容相同时。由于$Result尚未定义,因此这是$Result,这就是您获得空白行的原因。

甚至不需要$Result = If () {$null | ...}块。您已经使用If过滤了csv,只需将这些对象沿着管道传递到导出。

因为听起来你只是在父母的所有子文件夹上运行它,听起来好像你可以使用Where-Object的{​​{1}}参数

-Recurse

(我使用Get-ChildItem循环而不是Get-ChildItem '\\servername\volume\dir1\audit\serverbeingaudited\' -Recurse | ForEach-Object { Import-csv $_.FullName | Where-Object {$_.'path/from' -like "*01May18.xlsx*"} } | Export-CSV -Path c:\temp\output.csv 只是演示以另一种方式传递给管道的对象)

编辑:根据Bill_Stewart的建议删除了附加内容。将写出运行中递归文件夹的所有条目。将在下次运行时覆盖。

答案 1 :(得分:1)

我是否认为需要附加CSV文件?怎么样:

Get-ChildItem '\\servername\volume\dir1\audit\serverbeingaudited\20180525' | ForEach-Object {
  Import-Csv $_.FullName | Where-Object { $_.'path/from' -like '*01May18.xlsx*' }
} | Export-Csv 'C:\Temp\Output.csv' -NoTypeInformation

答案 2 :(得分:0)

假设您的CSV格式相同,并且您的搜索文字不太可能出现在任何其他列中,则可以使用Select-String代替Import-Csv。因此,您可以将字符串处理为字符串,而不是将字符串转换为对象并再次返回字符串。你需要添加一行来伪造标题行,如下所示:

$files = Get-ChildItem '\\servername\volume\dir1\audit\serverbeingaudited\20180525'

$result = @()
$result += Get-Content $files[0] -TotalCount 1 

$result += ($files | Select-String -Pattern '01May18\.xlsx').Line 
$result | Out-File 'c:\temp\output.csv'