如何将索引1和索引2之间的行提取到另一个csv变量?

时间:2015-08-17 05:47:42

标签: powershell

而不是像How to remove First and Last Line in Powershell

中那样输出具有Set-Content的文件
$csv = Import-Csv in.csv -header Date,Time,O,H,L,C,V | 
       Select * -ExcludeProperty time |
       Foreach {$_.date = [datetime]::ParseExact($_.date,"yyyy.MM.dd",$null).tostring("yyMMdd");$_.v=1;$_} |
       ConvertTo-Csv -NoTypeInformation
       for ($i = 1; $i -lt ($csv.Length - 1); $i++ { 
           $csv[$i] -replace '"' | Set-Content out.csv -encoding ascii
       }

我只想将这些行放在$ csv2 var而不是out.csv中。 Set-Content不适用于var。怎么做(我没有Powershell 5)?

2 个答案:

答案 0 :(得分:1)

代码的问题在于,每次调用Set-Content时,它都会重写文件并替换文件已有的任何内容。

考虑将-append开关添加到Set-Content。这将添加到文件而不是覆盖它。记住还要确保文件是空的,因为你开始写它。

我还会考虑使用更简单的方法来获取文件的“中间”内容。检查以下示例。它可能无法满足您的所有要求,但是使用Range运算符除了第一个和最后一个元素之外,它是一个简单的方法来获取数组中的所有元素。

# First setup the test data
$filecontent = @"
Line 1 skip please
Line 2 include
Line 3 include
Line 4 include
Line 5 include
Line 6 include
Line 7 include
Line 8 include
Line 9 include
Line 10 skip please
"@

$filecontent | Set-Content in.csv
$content = Get-Content in.csv
$content[-($content.Length-1)..-2] | Set-Content out.csv

答案 1 :(得分:1)

你快到了。而不是管道到Set-Content,只需将其分配给您的变量。 (顺便说一句,你的原始代码在for循环中缺少一个右括号,我在这里也进行了修正。)

$csv = Import-Csv in.csv -header Date,Time,O,H,L,C,V | 
       Select * -ExcludeProperty time |
       Foreach {$_.date = [datetime]::ParseExact($_.date,"yyyy.MM.dd",$null).tostring("yyMMdd");$_.v=1;$_} |
       ConvertTo-Csv -NoTypeInformation

$csv2 = for ($i = 1; $i -lt ($csv.Length - 1); $i++) { 
           $csv[$i] -replace '"'
       }