Powershell中剩余的行和百分比

时间:2016-01-06 14:20:35

标签: xml csv powershell percentage

我正在尝试创建一个读取XML文件的 powershell 程序,并将数据存储到excel文件中以更有效地分析它。所以我可以毫无问题地打开文档,读取XML并在CSV中写入没有任何问题。但是当用户启动他的程序时,我想向他显示剩余的行数百分比

这是我的代码:

$Packages = $xdoc.DataProfile.DataProfileOutput.Profiles.ColumnValueDistributionProfile
$PackageNumber = $Packages.Count

# --- For each couple, get the table name, the number of rows, the name of the field, and the number of different values existing in each fields --- #

$i = 0
while($i -ne $PackageNumber){
    $state = $i/$PackageNumber * 100
    $state = [math]::floor($state)
    Write-Host $state "of 100 %"

    # Here are commands to get infos about the content of the xml 

 $j = 0
    while($j -lt $ItemNumber){
        $Value = #value in the xml ..  
        $Count = #number of the row in the xml .. 
        # --- If the number of rows in the fields is different from 0, calculate the purcentage for each value and add it to the CSV --- #

        if($table_rows -ne 0){
            $Purcentage = $Count / $table_rows * 100
            $csv_content = $table_name + ";" + $table_field + ";" + $table_rows + ";" + $Value + ";" + $Count + ";" + $Purcentage
            ADD-content -path $csv_file -value $csv_content
        }
        $j++ 
    }
    $i++
}

这样,我可以计算总行数和缓冲区正在读取的行数。通过简单的划分,我获得百分比。

但结果是:

50 of 100 %
50 of 100 %
....
50 of 100 %
51 of 100 %
51 of 100 %
....
51 of 100 %

我如何为每个百分比值获得只有一行,而不是像下面那么多?

50 of 100 %
51 of 100 % 
52 of 100 %

2 个答案:

答案 0 :(得分:1)

想出了这样做的想法。在您的脚本中,添加行$oldState = 0,为我们提供基线百分比。

然后,在您的主脚本块中,在此行$state = [math]::floor($state)下方,添加以下内容:

if ($state -ne $oldState){
Write-Host $state "of 100 %"
$oldState = $state
}

最终结果将是比较以查看当前状态是否与写入屏幕的最后$state相同。如果不是,那么我们会写入百分比并为州设置新值。

,当脚本正在执行时,最终结果将只显示每个百分比一次。

答案 1 :(得分:0)

可能有更好的方法,但首先想到的是获取文件中的所有行,除了最后一行然后附加百分比。在这个例子中,我在文件末尾添加了一行,以确保我没有删除重要信息。

'asdf' > C:\temp\test.txt

' ' >> C:\temp\test.txt
0..100 | % {
    sleep 1
    $file = Get-Content 'C:\temp\Test.txt'
    $file = $file[0..$($file.Count-2)]
    $file += "$_%"
    $file > C:\temp\test.txt
    Get-Content C:\temp\test.txt
}