Powershell用于计算文件中的列数

Powershell用于计算文件中的列数,powershell,powershell-3.0,Powershell,Powershell 3.0,在导入到SQL之前,我需要测试文件的完整性。 文件的每一行应该有完全相同的列数 这些是以“|”分隔的文件。 我还需要忽略第一行,因为它是垃圾 如果每一行的列数不同,那么我需要编写一条错误消息 我尝试过使用类似以下的东西,但运气不佳: $colCnt = "c:\datafeeds\filetoimport.txt" $file = (Get-Content $colCnt -Delimiter "|") $file = $file[1..($file.count - 1)] Foreach($

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

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

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

我尝试过使用类似以下的东西,但运气不佳:

$colCnt = "c:\datafeeds\filetoimport.txt"
$file = (Get-Content $colCnt -Delimiter "|") 
$file = $file[1..($file.count - 1)]
Foreach($row in $file){
    $row.Count
}
数行很容易。列不是。
有什么建议吗?

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

$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.
编辑:添加了一个
,其中
捕获跳过空行(
?{$}

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列的行,只需删除
;中断
并让它运行。

是的,跳过第一行读取文件。对于每条线,将其在管道上拆分,并计算结果。如果与前一个不同,则抛出错误并停止

$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.
编辑:添加了一个
,其中
捕获跳过空行(
?{$}

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列的行,只需删除
;中断
并让它运行。

是的,跳过第一行读取文件。对于每条线,将其在管道上拆分,并计算结果。如果与前一个不同,则抛出错误并停止

$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.
编辑:添加了一个
,其中
捕获跳过空行(
?{$}

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列的行,只需删除
;中断
并让它运行。

是的,跳过第一行读取文件。对于每条线,将其在管道上拆分,并计算结果。如果与前一个不同,则抛出错误并停止

$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.
编辑:添加了一个
,其中
捕获跳过空行(
?{$}

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列的行,只需删除
;中断
并让它运行。

另一种可能性:

$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 }
这将在第二行中找到分隔符字符的数量,并构建一个可与
selectstring
一起使用的正则表达式模式

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

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

另一种可能性:

$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 }
这将在第二行中找到分隔符字符的数量,并构建一个可与
selectstring
一起使用的正则表达式模式

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

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

另一种可能性:

$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 }
这将在第二行中找到分隔符字符的数量,并构建一个可与
selectstring
一起使用的正则表达式模式

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

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

另一种可能性:

$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 }
这将在第二行中找到分隔符字符的数量,并构建一个可与
selectstring
一起使用的正则表达式模式

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


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

更通用的方法,包括正则表达式过滤器:

$path = "path\to\folder"
$regex = "regex"
$expValue = 450

$files= Get-ChildItem $path | Where-Object {$_.Name -match $regex}
Foreach( $f in $files) {
    $filename = $f.Name
    echo $filename
    $a = Get-Content $f.FullName;
    $i = 1;
    $e = 0;
    echo "Starting...";
    foreach($line in $a)
    {
        if ($line.length -ne $expValue){
            echo $filename
            $a | Measure-Object -Line
            echo "Long:"
            echo $line.Length;
            echo "Line Nº: "
            echo $i;
            $e = $e + 1;       
        }
        $i = $i+1;
    }
    echo "Finished";
    if ($e -ne 0){
        echo $e "errors found";
    }else{
        echo "No errors"
        echo ""
    }
}
echo "All files examined"

一种更通用的方法,包括正则表达式过滤器:

$path = "path\to\folder"
$regex = "regex"
$expValue = 450

$files= Get-ChildItem $path | Where-Object {$_.Name -match $regex}
Foreach( $f in $files) {
    $filename = $f.Name
    echo $filename
    $a = Get-Content $f.FullName;
    $i = 1;
    $e = 0;
    echo "Starting...";
    foreach($line in $a)
    {
        if ($line.length -ne $expValue){
            echo $filename
            $a | Measure-Object -Line
            echo "Long:"
            echo $line.Length;
            echo "Line Nº: "
            echo $i;
            $e = $e + 1;       
        }
        $i = $i+1;
    }
    echo "Finished";
    if ($e -ne 0){
        echo $e "errors found";
    }else{
        echo "No errors"
        echo ""
    }
}
echo "All files examined"

一种更通用的方法,包括正则表达式过滤器:

$path = "path\to\folder"
$regex = "regex"
$expValue = 450

$files= Get-ChildItem $path | Where-Object {$_.Name -match $regex}
Foreach( $f in $files) {
    $filename = $f.Name
    echo $filename
    $a = Get-Content $f.FullName;
    $i = 1;
    $e = 0;
    echo "Starting...";
    foreach($line in $a)
    {
        if ($line.length -ne $expValue){
            echo $filename
            $a | Measure-Object -Line
            echo "Long:"
            echo $line.Length;
            echo "Line Nº: "
            echo $i;
            $e = $e + 1;       
        }
        $i = $i+1;
    }
    echo "Finished";
    if ($e -ne 0){
        echo $e "errors found";
    }else{
        echo "No errors"
        echo ""
    }
}
echo "All files examined"

一种更通用的方法,包括正则表达式过滤器:

$path = "path\to\folder"
$regex = "regex"
$expValue = 450

$files= Get-ChildItem $path | Where-Object {$_.Name -match $regex}
Foreach( $f in $files) {
    $filename = $f.Name
    echo $filename
    $a = Get-Content $f.FullName;
    $i = 1;
    $e = 0;
    echo "Starting...";
    foreach($line in $a)
    {
        if ($line.length -ne $expValue){
            echo $filename
            $a | Measure-Object -Line
            echo "Long:"
            echo $line.Length;
            echo "Line Nº: "
            echo $i;
            $e = $e + 1;       
        }
        $i = $i+1;
    }
    echo "Finished";
    if ($e -ne 0){
        echo $e "errors found";
    }else{
        echo "No errors"
        echo ""
    }
}
echo "All files examined"

以“|”分隔的行或列?在此上下文中,代码表示行由“|”(而不是换行符)分隔,行由“|”分隔,列由“|”分隔?在此上下文中,代码表示行由“|”(而不是换行符)分隔,行由“|”分隔,列由“|”分隔?在此上下文中,代码表示行由“|”(而不是换行符)分隔,行由“|”分隔,列由“|”分隔?在这种情况下,代码表示行由“|”(而不是换行符)分隔,这非常有效。我唯一没有想到的是,这些文件的底部通常有一到两个空行。有没有办法忽略空行和页脚?更新了我的答案以处理空行。老实说,乔利诺的回答比我的更性感,但我的