我写了一个试图确定最大数量的脚本。每列的字符。这就是我写的:
$path = 'folder path'
$file = Get-ChildItem $path\*
$FileContent = foreach ($files in $file) {
$FileHeader = @( (Get-Content $files -First 1).Split($delimiter) )
$importcsv = @( Import-Csv $files -Delimiter "$delimiter" )
for ($i=0; $i -lt $FileHeader.Length; $i++) {
#select each column
$Column = @( $importcsv | select $FileHeader[$i] )
#find the max no. of character
$MaxChar = @(($Column[$i] |
Select -ExpandProperty $FileHeader[$i] |
Measure-Object -Maximum -Property Length).Maximum)
$output = New-Object PSObject
$output | Add-Member NoteProperty FullName ($files.FullName)
$output | Add-Member NoteProperty FileName ($files.Name)
$output | Add-Member NoteProperty Time (Get-Date -Format s)
$output | Add-Member NoteProperty FileHeader ($($FileHeader[$i]))
$output | Add-Member NoteProperty MaxCharacter ($($MaxChar[$i]))
Write-Output $output
}
}
上面的脚本只是其中的一部分,因此$delimiter
已经定义。最后,我将结果导出为CSV。
脚本运行时没有任何错误,但是当我打开文件时,它只给我第一列/标题最大值。字符,其余列/标题丢失。
完美的结果将显示每个列/标题最大值。性格。
我的循环有问题吗?
我的老板正在尝试创建一个自动化流程来查找原始数据中的所有信息并使用这些信息上传到数据库,因此缺少的部分脚本是关于确定原始文件的分隔符, $CleanHeader
是$FileHeader
的干净版本(删除所有特殊字符,将大写字母转换为小写字母),这些清理程序将用于数据库表格中的标题。并且他还想知道每列中的最大字符,以便info可以使用它们来创建数据库中表的列的大小(他知道这部分可以在sql中完成),但他问我是否可以在PowerShell中完成。
答案 0 :(得分:0)
这应该有效:
$ht = @{}
# import a CSV and iterate over its rows
Import-Csv $f.FullName -Delimiter "$delimiter" | ForEach-Object {
# iterate over the columns of each row
$_.PSObject.Properties | ForEach-Object {
# update the hashtable if the length of the current column value is greater
# than the value in the hashtable
if ($_.Value.Length -gt $ht[$_.Name]) {
$ht[$_.Name] = $_.Value.Length
}
}
}
# create an object for each key in the hashtable
$date = Get-Date -Format s
$ht.Keys | ForEach-Object {
New-Object -Type PSObject -Property @{
FullName = $f.FullName
Name = $f.Name
Time = $date
FileHeader = $_
MaxCharacter = $ht[$_]
}
}
答案 1 :(得分:0)
FileHeader[$i]
使用引号返回列名:"ColumnName"
而不是ColumnName
要修复,只需在您拉动标题的行添加修剪:
$FileHeader = @( (Get-Content $files -First 1).Split($delimiter).trim('"') )