如何检查文件中的列数以满足条件

时间:2018-07-13 18:44:22

标签: powershell powershell-v3.0 powershell-v4.0

我正在尝试编写PowerShell脚本以检查列数,并查看其是否满足条件,否则抛出错误或发送电子邮件。 我尝试过的东西:

$columns=(Get-Content "C:\Users\xs15169\Desktop\temp\OEC2_CFLOW.txt" | select  -First 1).Split(",")
$Count=columns.count
if ($count -eq 280)
  echo "column count is:$count"
else 
  email

1 个答案:

答案 0 :(得分:0)

我将假定您的文本文件为CSV格式,如果它是文本文件表且未格式化为CSV,我无法想象您使用的是哪种格式。

如果您的CSV文件具有标题

处理CSV文件,并计算所得Powershell对象的属性数量。

$columnCount = @( ( Import-Csv '\path\to\file.txt' ).PSObject.Properties ).Count

我们需要强制Properties对象到数组(这是@()语法)以准确地获取计数。 PSObject属性是有关Powershell中某个对象的元数据的隐藏属性,我们可以在其中查找Properties(列名)并获取数量。

不带标题的CSV

如果CSV没有标题,则Import-Csv要求您手动指定标题。您可以通过技巧来即时建立唯一的列名,但是对于仅获取列数而言,它们太复杂了。

要采用您在上面已经尝试过的方法,我们可以在第一行中获取数据并处理列数,尽管您在问题中做得不正确。正确操作的方法如下:

$columnCount = ( ( Get-Content "\path\to\file.txt" | Select-Object -First 1 ) -Split ',' ).Count

原件出了什么问题

以上两种解决方案都可以使列数减少到一行代码。但是在您的原始样本中,您犯了一些小错误:

$columns=( Get-Content "\path\to\file.txt" | select  -First 1 ).Split(",")

# You forgot to prepend "columns" with a $. Should look like the below line
$Count=$columns.count

您忘记在if块中使用花括号:

if ($count -eq 280) {
  echo "column count is:$count"
} else { 
  email
}

对于使用-Split运算符与.Split()方法而言,这纯粹是样式方面的偏爱,而使用Split()是完全有效的。