私はファイルごとに行単位で余分な区切り文字を探しています。 しかし、ファイル内のヘッダー行(最初の行)とフッター行(最後の行)を無視して、ファイルの詳細に焦点を当てたいと思います。Powershell - ファイル内のヘッダー行(最初の行)とフッター行(最後の行)を無視するのが難しい
ReadLine()
メソッドを使用して最初と最後の行を無視する方法がわかりません。私はファイルを何らかの方法で変更したくないので、このスクリプトは、余分なデリミタを持つCSVファイルの行を識別するためにのみ使用されます。
注意:検索するファイルには何百万行もあり、そのためにはGet-Content
の手法ではなくReadLine()
メソッドに頼らざるを得ません。
私はSelect-Object -Skip 1 | Select-Object -SkipLast 1
を$measure
に値を入力するステートメントに使用しようとしましたが、希望の結果が得られませんでした。例えば
:
H|Transaction|2017-10-03 12:00:00|Vendor --> This is the Header
D|918a39230a098134|2017-08-31 00:00:00.000|2017-08-15 00:00:00.000|SLICK-2340|...
D|918g39230b095134|2017-08-31 00:00:00.000|2017-08-15 00:00:00.000|EX|SRE-68|...
T|1268698 Records --> This is Footer
は基本的に、私は私のスクリプトは、ヘッダとフッタを無視したい、となるように正しいレコードの例及び他の詳細レコードとして最初のデータ行(D|918...
)を使用しエラーのためにそれと比較(この例では第二の詳細行は、返さなければならないので、そこに無効なデリミタフィールド(EX|SRE-68...
)。
Iはget-content
文で-skip 1
と-skiplast 1
を使用してみました、プロセスがまだありますヘッダー行を使用してすべての詳細レコードを無効なレコードとして戻します。
はここに...私がこれまで持っているものだ
編集者注:明記の意図にもかかわらず、このコードは、参照列数を決定するために ヘッダー行(1行目)を使用して行います。
$File = "test.csv"
$Delimiter = "|"
$measure = Get-Content -Path $File | Measure-Object
$lines = $measure.Count
Write-Host "$File has ${lines} rows."
$i = 1
$reader = [System.IO.File]::OpenText($File)
$line = $reader.ReadLine()
$reader.Close()
$header = $line.Split($Delimiter).Count
$reader = [System.IO.File]::OpenText($File)
try
{
for()
{
$line = $reader.ReadLine()
if($line -eq $null) { break }
$c = $line.Split($Delimiter).Count
if($c -ne $header -and $i -ne${lines})
{
Write-Host "$File - Line $i has $c fields, but it should be $header"
}
$i++
}
}
finally
{
$reader.Close()
}
あなたはあなたの助けthe_swとmklement0ありがとうございました! 私が検索しようとしているファイルは、何百万行にもなりますが、get-contentメソッドを使用すると、あまりうまく機能しないようです。たとえば、get-contentメソッドを使用して、500,000行の大きなファイルの場合、約30分かかります。 – Pavan