Powershell计算文件中的列

时间:2014-04-16 20:00:19

标签: powershell powershell-v3.0

我需要在导入SQL之前测试文件的完整性。 文件的每一行应具有完全相同的列数。

这些是" |"分隔文件。 我还需要忽略第一行,因为它是垃圾。

如果每一行的列数不同,那么我需要写一条错误信息。

我尝试使用以下类似的东西但没有运气:

$colCnt = "c:\datafeeds\filetoimport.txt"
$file = (Get-Content $colCnt -Delimiter "|") 
$file = $file[1..($file.count - 1)]
Foreach($row in $file){
    $row.Count
}

计算行很容易。列不是。 有什么建议吗?

3 个答案:

答案 0 :(得分:2)

是的,请阅读跳过第一行的文件。对于每一行,将其拆分在管道上,并计算结果。如果它与之前的相同,则抛出错误并停止。

$colCnt = "c:\datafeeds\filetoimport.txt"
[int]$LastSplitCount = $Null
Get-Content $colCnt | ?{$_} | Select -Skip 1 | %{if($LastSplitCount -and !($_.split("|").Count -eq $LastSplitCount)){"Process stopped at line number $($_.psobject.Properties.value[5]) for column count mis-match.";break}elseif(!$LastSplitCount){$LastSplitCount = $_.split("|").Count}}

应该这样做,如果发现列数不好,它将停止并输出如下内容:

Process stopped at line number 5 for column count mis-match.

修改:添加Where抓取以跳过空白行(?{$_}
Edit2:好的,如果您知道列数应该是多少,那么这就更容易了。

Get-Content $colCnt | ?{$_} | Select -Skip 1 | %{if(!($_.split("|").Count -eq 210)){"Process stopped at line number $($_.psobject.Properties.value[5]), incorrect column count of: $($_.split("|").Count).";break}}

如果您希望它返回所有不具有210列的行,只需删除;break并让其运行。

答案 1 :(得分:1)

更通用的方法,包括RegEx过滤器:

foreach($data as $key=>$val) {
    $attribute = new ProductsAttributes;
    $attribute->product_id = $id;
    $attribute->sku = $val['sku'];
    $attribute->size = $val['size'];
    $attribute->price = $val['price'];
    $attribute->stock = $val['stock'];
    $attribute->save();
}

答案 2 :(得分:0)

另一种可能性:

$colCnt = "c:\datafeeds\filetoimport.txt"

$DataLine = (Get-Content $colCnt -TotalCount 2)[1]
$DelimCount = ([char[]]$DataLine -eq '|').count
$MatchString = '.*' + ('|.*' * $DelimCount )

$test = Select-String -Path $colCnt -Pattern $MatchString -NotMatch |
  where { $_.linenumber -ne 1 }

这将在第二行中找到分隔符字符的数量,并构建可与Select-String一起使用的正则表达式模式。

-NotMatch开关将使任何与该模式不匹配的行返回为具有问题行的文件名,行号和内容的MatchInfo对象。

编辑:因为第一行是"垃圾"你可能不在乎它是否匹配,所以我在结果中添加了一个过滤器来删除它。