Powershell afronden getallen in tekst bestand

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • MrNOnamE
  • Registratie: Mei 2003
  • Laatst online: 19-07 15:13
Voor het importeren van een tekst bestand zit ik met een probleem dat deze eerst aangepast dient te worden. Nu kan ik dit telkens handmatig gaan doen maar het leek mij leuker en leerzamer om dit dmv een powershell script te doen.

Het uiteindelijke doel is het volgende :
1 Selecteer een tekst bestand om te bewerken
2 Rond alle getallen af naar hele getallen
3 Maak alle negatieve getallen positief
4 verwijder de laatste regel uit het tekst bestand

De inhoud van het bestand dat bewerkt moet worden is als volgt :
code:
1
2
3
4
Getal1;5059,23;;Omschrijving getal 1
Getal2;-18320,87;;Omschrijving getal 3
Getal3;-0,69;;Omschrijving getal 3
Regel met te verwijderen tekst


Het uiteindelijke bestand moet bevatten :
code:
1
2
3
Getal1;5059;;Omschrijving getal 1
Getal2;18321;;Omschrijving getal 3
Getal3;1;;Omschrijving getal 3


Na een avond googlen en trail and error ben ik tot het volgende gekomen :

PowerShell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
## Open bestand om te bewerken.
Function Get-OpenFile($initialDirectory)
{ 
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |
Out-Null

$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.initialDirectory = $initialDirectory
$OpenFileDialog.filter = "Text files (*.txt)|*.txt"
$OpenFileDialog.ShowDialog() | Out-Null
$OpenFileDialog.filename
$OpenFileDialog.ShowHelp = $true
}

$InputFile = Get-OpenFile


## Verwijder negatieve getallen door het - teken te verwijderen
## Replace ;- met - zodat niet het koppelteken in mogelijke tekst word vervangen
(Get-Content $InputFile) | Foreach-Object {
    $_ -replace ';-', ';' `
    } | Set-Content $InputFile


## Verwijder de laatste regel
$output = Get-Content $InputFile -ReadCount 0
Set-Content $InputFile -Value ($output | Select-Object -First ($output.count-1))


Met mijn helaas nogal wat beperkte kennis loop ik helaas tegen een muur aan bij het afronden van de getallen. Zelfs met flink googlen lukt het me niet om dit opgelost te krijgen. Hopelijk kan iemand mij hier een duuwtje in de juiste richting geven.

[ Voor 4% gewijzigd door MrNOnamE op 14-12-2016 21:37 ]

☀️ 39 Panelen |⚡SolarEdge SE12.5K | 🔆 Panasonic 7KW KIT-WC07J3E5 | ❄❄❄❄ Mitsubishi SRK 20ZSX-W

Beste antwoord (via MrNOnamE op 15-12-2016 07:53)


  • HMS
  • Registratie: Januari 2004
  • Laatst online: 16-07 23:57

HMS

Je moet ook een argument meegeven aan Round, namelijk welk getal je wilt afronden. Maar het lijkt er op dat je het bestand lijn voor lijn verwerkt, je zou kunnen proberen om deze lijn op te splitsen in stukken die je afzonderlijk kunt verwerken. Gezien de structuur zou je misschien iets met MSDN: Import-Csv kunnen doen.

Alle reacties


Acties:
  • 0 Henk 'm!

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 16-07 23:57

HMS

Met een google op 'powershell round number' kwam ik uit op (eerste hit): https://blogs.technet.mic...ershell-to-round-numbers/

Is dit niet voldoende?

Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

MrNOnamE schreef op woensdag 14 december 2016 @ 21:34:
code:
1
2
3
4
5
## Verwijder negatieve getallen door het - teken te verwijderen
## Replace ;- met - zodat niet het koppelteken in mogelijke tekst word vervangen
(Get-Content $InputFile) | Foreach-Object {
    $_ -replace ';-', ';' `
    } | Set-Content $InputFile
Yugh. Dit is lelijke code. HMS gaf al een voorzetje. Dit kun je gewoon met [math]::Abs() doen om de absolute waarde te bepalen. Behandel getallen ook echt als getallen in je code.

Acties:
  • 0 Henk 'm!

  • MrNOnamE
  • Registratie: Mei 2003
  • Laatst online: 19-07 15:13
HMS schreef op woensdag 14 december 2016 @ 21:46:
Met een google op 'powershell round number' kwam ik uit op (eerste hit): https://blogs.technet.mic...ershell-to-round-numbers/

Is dit niet voldoende?
Helaas voor mij niet. Met losse getallen krijg ik dit perfect werkend. Het probleem voor mij is om deze functie over het hele bestand te laten lopen. Dit kreeg ik wel voor elkaar met replace, maar niet met de Math functie.
downtime schreef op woensdag 14 december 2016 @ 22:02:
[...]

Yugh. Dit is lelijke code. HMS gaf al een voorzetje. Dit kun je gewoon met [math]::Abs() doen om de absolute waarde te bepalen. Behandel getallen ook echt als getallen in je code.
Helemaal mee is. DMV de replace krijg ik het voor elkaar maar niet op een nette manier. Zodra ik de Math functie werkend heb gaat die meteen aangepast worden

Onderstaande code geeft helaas een foutmelding :
code:
1
2
3
(Get-Content $InputFile) | Foreach-Object {
    [Math]::Round()
    } | Set-Content $InputFile


Onderstaande foutmelding :
code:
1
2
3
4
5
6
Cannot find an overload for "Round" and the argument count: "0".
At C:\Users\gebruiker\Desktop\test.ps1:18 char:5
+     [Math]::Round()
+     ~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

☀️ 39 Panelen |⚡SolarEdge SE12.5K | 🔆 Panasonic 7KW KIT-WC07J3E5 | ❄❄❄❄ Mitsubishi SRK 20ZSX-W


Acties:
  • +1 Henk 'm!

  • Tripple20
  • Registratie: Maart 2011
  • Niet online

Tripple20

- Target Lost -

Bij voorbaat: even ter plekke bedacht en geen ervaring met powershell

Ideetje:

Split je bestand per regel op basis van ';' :
1e hit Google: https://blogs.technet.mic...lit-method-in-powershell/

Dan kun je het getal eruit halen en los bewerken.

Kun je gelijk de suggestie van downtime toepassen ;)

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 16-07 23:57

HMS

Je moet ook een argument meegeven aan Round, namelijk welk getal je wilt afronden. Maar het lijkt er op dat je het bestand lijn voor lijn verwerkt, je zou kunnen proberen om deze lijn op te splitsen in stukken die je afzonderlijk kunt verwerken. Gezien de structuur zou je misschien iets met MSDN: Import-Csv kunnen doen.

  • MrNOnamE
  • Registratie: Mei 2003
  • Laatst online: 19-07 15:13
Bedankt Tripple20 en HMS. Dit was het duuwtje de goede richting op wat ik zocht ! Ik ga even verder zoeken naar het los laten verwerken van alle getallen door Round.

☀️ 39 Panelen |⚡SolarEdge SE12.5K | 🔆 Panasonic 7KW KIT-WC07J3E5 | ❄❄❄❄ Mitsubishi SRK 20ZSX-W


  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 19-07 16:15
Je input file ziet eruit als semicolon seperated ; Import-CSV heeft hier gewoon ondersteuning voor.
PowerShell:
1
Import-CSV -path <path> -Delimiter ';'


Mocht je inputfile geen headers bevatten dan kun je deze eventueel nog specificeren (dit worden dan de properties van je nieuwe object wat het processen hiervan stukken makkelijker maakt).

Je bent het jezelf nu onnodig moeilijk aan het maken door met strings te werken die je parsed (ipv gewoon lekker met simpele objecten te werken).
Het zorgt ook gelijk voor beter leesbare code.
Pagina: 1