我需要在导入SQL之前测试文件的完整性。 文件的每一行应具有完全相同的列数。
这些是" |"分隔文件。 我还需要忽略第一行,因为它是垃圾。
如果每一行的列数不同,那么我需要写一条错误信息。
我尝试使用以下类似的东西但没有运气:
$colCnt = "c:\datafeeds\filetoimport.txt"
$file = (Get-Content $colCnt -Delimiter "|")
$file = $file[1..($file.count - 1)]
Foreach($row in $file){
$row.Count
}
计算行很容易。列不是。 有什么建议吗?
答案 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对象。
编辑:因为第一行是"垃圾"你可能不在乎它是否匹配,所以我在结果中添加了一个过滤器来删除它。