J'essaie d'écrire un script Powershell qui prendra plusieurs très longs fichiers séparés par des espaces et exportera certaines colonnes vers des fichiers CSV portant le même nom.
J'ai une version réussie:
Foreach ($file in $files) {
$WriteString=""
$outfile = $path + "\" + ($file -replace ".{4}$") + ".csv"
Get-Content -Path $path"\"$file | Select-Object -Skip $lines | ForEach-Object{
$ValueArray = ($_ -split "\s+")
$WriteString += $ValueArray[1] + "," + $ValueArray[2] + "," + $ValueArray[3] + "`n"
}
Add-Content -Path $outfile -Value $Writestring
}
Cela fonctionne, mais est extrêmement lent - il faut plus de 16 heures pour que le script s'exécute complètement. La cause principale (je pense) est d'ajouter à la chaîne. J'ai essayé d'améliorer cela en utilisant une table de hachage:
Foreach ($file in $files) {
$outfile = $path + "\" + ($file -replace ".{4}$") + ".csv"
$ParseLines = Get-Content -Path $path"\"$file | Select-Object -Skip $lines
$OutputData = ForEach ($Line in $ParseLines) {
$ValueArray = ($Line -split "\s+")
$Line | Select-Object $ValueArray[1], $ValueArray[2], $ValueArray[3]
}
$OutputData | Export-CSV -Path $outfile #-NoTypeInformation
}
Cependant, cela n'exporte qu'une seule ligne de la table de hachage:
#TYPE Selected.System.String
"636050.000","7429825.000","77.438"
,,
,,
,,
,,
,,
,,
Si je change la dernière ligne en:
Set-Content -Path $outfile -Value $OutputData
alors la sortie devient:
@{636050.000=; 7429825.000=; 77.438=}
@{636075.000=; 7429825.000=; 75.476=}
@{636100.000=; 7429825.000=; 74.374=}
@{636125.000=; 7429825.000=; 73.087=}
@{636150.000=; 7429825.000=; 71.783=}
@{636175.000=; 7429825.000=; 70.472=}
Je fais clairement quelque chose de mal avec la table de hachage ou Export-CSV, mais je ne peux pas le comprendre. Toute aide sera fortement appréciée.
Comme demandé ci-dessous, voici une partie d'un fichier source. J'ai supprimé toutes les lignes non-données et n'inclut pas les en-têtes dans mon CSV de sortie, car le programme d'entrée (dans lequel les fichiers CSV entrent) n'en a pas besoin et les sorties sont évidentes (peu de chance de obtenir les valeurs X, Y et Z erronées simplement en regardant les données).
*
* DEFINITION
* HEADER_VARIABLES 3
* QUALITIES C 16 0 key
* DATE C 12 0
* TIME C 12 0
* VARIABLES 4
* X F 12 3
* Y F 12 3
* Z F 12 3
* gcmaq0.drg F 12 3
*
* 1 2 3 4
*23456789012345678901234567890123456789012345678
* X| Y| Z| gcmaq0.drg|
*
* HEADER:QUALITIES 29Aug2018 13:53:16
636575.000 7429800.000 75.551 75.551
636600.000 7429800.000 77.358 77.358
636625.000 7429800.000 78.823 78.823
636650.000 7429800.000 80.333 80.333
636675.000 7429800.000 82.264 82.264
636700.000 7429800.000 84.573 84.573
636725.000 7429800.000 87.447 87.447
Évitez les opérations lentes telles que l'ajout de chaînes (ou de tableaux) dans une boucle. Change ça:
Get-Content -Path $path"\"$file |
Select-Object -Skip $lines |
ForEach-Object {
$ValueArray = ($_ -split "\s+")
$WriteString += $ValueArray[1] + "," + $ValueArray[2] + "," + $ValueArray[3] + "`n"
}
Add-Content -Path $outfile -Value $Writestring
dans ceci:
Get-Content -Path "${path}\${file}" |
Select-Object -Skip $lines |
ForEach-Object {
($_ -split "\s+")[1..3] -join ','
} |
Set-Content -Path $outfile
Remplacez Set-Content
par Add-Content
si vous souhaitez réellement ajouter à un fichier existant.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots