2016-11-23 5 views
1

私は最大数を決定しようとするスクリプトを書いています。各列の文字の数。各列の最大文字数を調べようとしています。

$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のクリーンバージョンです(すべての特殊文字を削除し、大文字を小文字に変換します)。これらのクリーンヘッダは、データベースのテーブルのヘッダーに使用されます。また、各列の最大文字数を知りたいので、情報でデータベースのテーブルの列サイズを作成することができます(この部分はSQLで実行できることがわかります)。しかし、 PowerShellで行うこともできません。

+0

なぜ最大文字数を知る必要がありますか?列ではどういう意味ですか?あなたは長い名前のファイルを見つける方法を尋ねていますか? –

+1

PowerShellでは実行できないものはほとんどありません。そのため、「PowerShellでできることはできますか?」という質問に対する答えは、実際には常に「はい」です。本当の疑問は、XXXを実装するのにどれだけの労力がかかりますか? –

答えて

0

これは動作するはずです:ちょうどあなたがヘッダを引くラインにトリムを追加、修正するには"ColumnName"代わりのColumnName

$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[$_] 
    } 
} 
+0

私はそれを試して、それは動作します、私はかなりPowershellの新ですので、私はいくつかの初心者の質問を持って、$ _ =(Import-CSV ...)、それは正しいですか?それで$ _は何ですか?名前は意味ですか?私は$ htがハッシュテーブルであることを知っているので、$ ht [$ _。Name]はどういう意味ですか?ありがとう – gshtong

+0

'$ _'は現在のオブジェクト変数です(現在のオブジェクトをパイプラインに保持します)。 ['about_Automatic_Variables'](https://technet.microsoft.com/en-us/library/hh847768.aspx)を参照してください。 –

0

FileHeader[$i]は引用符で列名を返していました

$FileHeader = @((Get-Content $files -First 1).Split($delimiter).trim('"'))

関連する問題