Je cherche des délimiteurs supplémentaires dans mon fichier ligne par ligne. Je voudrais, cependant, ignorer la ligne d'en-tête (première rangée) et la rangée de pied de page (dernière rangée) dans le fichier et juste se concentrer sur les détails du fichier.Powershell - J'ai de la difficulté à ignorer la ligne d'en-tête (première rangée) et la rangée de bas de page (dernière rangée) dans le fichier
Je ne suis pas sûr de savoir comment ignorer la première et la dernière ligne en utilisant la méthode ReadLine()
. Je ne veux pas modifier le fichier d'aucune façon, ce script est utilisé juste pour identifier les lignes du fichier CSV qui ont des délimiteurs supplémentaires.
Veuillez noter: Le fichier que je cherche à chercher a des millions de lignes et pour ce faire, je dois me fier à la méthode ReadLine()
plutôt qu'à l'approche Get-Content
.
J'ai essayé d'utiliser Select-Object -Skip 1 | Select-Object -SkipLast 1
dans mon instruction Get-Content
en entrant la valeur dans $measure
mais je n'ai pas obtenu le résultat souhaité.
Par exemple:
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
Fondamentalement, je veux que mon script pour ignorer l'en-tête et pied de page, et utiliser la première ligne de données (D|918...
) comme l'exemple d'un enregistrement correct et les autres documents de détail à par rapport contre l'erreur (dans cet exemple, la deuxième ligne de détail doit être retourné, parce qu'il ya un séparateur valide dans le champ (EX|SRE-68...
).
Quand j'ai essayé d'utiliser -skip 1
et -skiplast 1
dans la déclaration get-content
, le processus est encore en utilisant la ligne d'en-tête comme comparaison et renvoyant tous les enregistrements de détail en tant qu'enregistrements invalides.
Voici ce que j'ai jusqu'à présent ...
Note de l'éditeur: En dépit de l'intention déclarée, ce code n'utilise la ligne (1ère ligne) tête pour déterminer le nombre de colonnes de référence.
$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()
}
Merci Vous the_sw et mklement0 pour votre aide! Les fichiers que j'essaie de parcourir sont parfois des millions de lignes volumineuses et, en cas d'utilisation de la méthode get-content, il semble plutôt mal fonctionner. Par exemple, il faut environ une demi-heure pour un fichier de 500 000 lignes, en utilisant la méthode get-content. – Pavan