2 votes

PowerShell supprimer la dernière colonne d'un fichier texte délimité par des tuyaux

J'ai un dossier de fichiers texte délimités par des tuyaux dont je dois supprimer la dernière colonne. Je ne suis pas expérimenté en PS mais j'ai trouvé assez d'informations grâce à des recherches pour m'aider. J'ai deux morceaux de code. Le premier crée de nouveaux fichiers texte dans mon chemin de destination, conserve le délimiteur de tuyaux, mais ne supprime pas la dernière colonne. Il y a 11 colonnes. Voici ce script :

$ OutputFolder = "D: \ DC_Costing \ Vendor Domain \ CostUpdate_Development_Load_To_IMS"

ForEach ($ File in (Get-ChildItem "D: \ DC_Costing \ Vendor Domain \ CostUpdate_Development_Stage_To_IMS \ *.txt")) 
{
(Get-Content $ File) | Foreach-Object { $_.split()[0..9] -join '|' } | Out-File $ OutputFolder \ $ ($ File.Name)
}

Ensuite, ce second code que j'ai essayé crée les nouveaux fichiers texte dans mon chemin de destination, IL se débarrasse de la dernière colonne, mais perd le délimiteur de tuyaux. Ouais.

$ OutputFolder = "D: \ DC_Costing \ Vendor Domain \ CostUpdate_Development_Load_To_IMS"

ForEach ($ File in (Get-ChildItem "D: \ DC_Costing \ Vendor Domain \ CostUpdate_Development_Stage_To_IMS \ *.txt")) 
{
Import-Csv $ File -Header col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11 -Delimiter '|' | 
Foreach-Object {"{0} {1} {2} {3} {4} {5} {6} {7} {8} {9}" -f $ _.col1, $ _.col2, $ _.col3, $ _.col4, $ _.col5, $ _.col6, $ _.col7, $ _.col8, $ _.col9, $ _.col10} | Out-File $ destination \ $ ($ File.Name)
}

Je n'ai aucune idée de ce que je fais de mal. Je n'ai pas de préférence pour la manière dont je veux que cela soit fait, mais je dois conserver le délimiteur et supprimer la dernière colonne. Toute aide serait grandement appréciée.

1voto

mklement0 Points 12597

Lors de votre tentative de traitement en texte brut avec Get-Content, vous devez simplement d'abord diviser chaque ligne par | (.Split('|')), avant d'extraire les champs d'intérêt avec une opération de plage (..) et de les joindre à nouveau avec |:

Get-Content $File | 
  Foreach-Object { $_.Split('|')[0..9] -join '|' } |
    Out-File $OutputFolder\$($File.Name)

Dans votre tentative basée sur Import-Csv, vous pouvez tirer parti du fait qu'il ne lira que les colonnes pour lesquelles vous avez fourni des noms de colonnes, via -Header:

# Passez uniquement 10 noms de colonne à -Header
Import-Csv $File -Header (0..9).ForEach({ 'col' + $_ }) -Delimiter '|' | 
  ConvertTo-Csv -Delimiter '|' | # convertir de nouveau en CSV avec délimiteur '|'
    Select-Object -Skip 1 |  # sauter la ligne d'en-tête
      Out-File $destination\$($File.Name)

Notez que ConvertTo-Csv, tout comme Export-Csv par défaut, mets des guillemets doubles autour de chaque champ dans les données / fichiers CSV résultants.

Dans Windows PowerShell, vous ne pouvez pas éviter cela, mais dans PowerShell (Core) 7+ vous pouvez contrôler ce comportement avec -UseQuotes Never, par exemple.

0voto

Santiago Squarzon Points 3956

Vous pouvez essayer cela, cela devrait être plus efficace que d'utiliser Import-Csv, cependant notez que cela devrait toujours exclure la dernière colonne de vos fichiers quelle que soit leur nombre de colonnes et en supposant qu'ils soient délimités par des tuyaux:

$OutputFolder = "D:\DC_Costing\Vendor Domain\CostUpdate_Development_Load_To_IMS"

foreach ($File in (Get-ChildItem "D:\DC_Costing\Vendor Domain\CostUpdate_Development_Stage_To_IMS\*.txt")) {
    [IO.File]::ReadAllLines($File.FullName) | & {
        process{
            -join ($_ -split '(?=\|)' | Select-Object -SkipLast 1)
        }
    } | Set-Content (Join-Path $OutputFolder -ChildPath $File.Name)
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X