Vraag Powershell 2: Hoe een specifiek personage uit een groot aantal ASCII-teksten te verwijderen


Ik probeer vreemde tekens uit tekenreeksen te verwijderen met PowerShell. Ik heb de volgende uitvoer gebruikt om te proberen het zelf te leren:

get-help about_regular_expressions

Ik probeer een string te nemen die voornamelijk ASCII is, maar die heeft een afwijkend karakter dat moet worden verwijderd. (Het geregistreerde handelsmerksymbool, de R met een cirkel eromheen.) Ik zou elk voorkomen van dat personage uit een touwtje willen verwijderen, en alles intact laten. Wat is de schoonste uitdrukking om dit te bereiken met PowerShell 2.0?

[BEWERK]

Ik heb een beetje verder gegraven en ik denk dat het probleem wordt veroorzaakt door de Import-CSV-oproep die ik gebruik.

Wanneer ik dit symbool knip en plak vanuit kladblok in de PS-prompt, en het toewijs aan een string, kom ik overeen:

# This code yields 'True'
$string -match "\u00ae"

Wanneer ik echter Import-CSV op een CSV-bestand gebruik waarbij een van de velden het speciale symbool bevat, denk ik op de een of andere manier dat de onbewerkte bytes worden geconverteerd, omdat zoiets als dit niet werkt:

# This code yields 'False'
$source = Import-CSV -path testing.csv
# The following extracts the entry / line containing the special symbol that was
# copy-and-pasted above
$culprit = $source[5].COMMITTEE_NAME
$culprit -match "\u00ae"

Het volgende werkt echter:

# This yields True
$filedata = get-content testing.csv
$filedata[6] -match "\u00ae"

Dus ik denk dat mijn vervolgvraag voor dit alles is:

Hoe kan ik de strings intact houden door de import-csv-oproep zodat de aanroep van de -match voor de afzonderlijke velden nog steeds werkt?


5
2017-09-21 00:02


oorsprong




antwoorden:


Het is belangrijk op te merken dat de console PS Unicode niet goed weergeeft. Je zult de ISE moeten gebruiken om te "zien" wat er gebeurt. Kijk even naar deze gerelateerde SO-vraag voor wat extra lezen. U kan gebruik het teken in PS, ongeacht of u het script niet in-actie hoeft te bekijken.

In de ISE:

PS C:\Users\jscott> $string = "This string contains the  character"
PS C:\Users\jscott> $string
This string contains the  character

PS C:\Users\jscott> $string.Replace("","")
This string contains the  character

PS C:\Users\jscott> $string ="This  string  contains  many  characters "
PS C:\Users\jscott> $string
This  string  contains  many  characters 

PS C:\Users\jscott> $string.Replace("","")
This  string  contains  many  characters 

Om de tekencode te gebruiken in plaats van de letterlijke:

PS C:\Users\jscott> $string.Replace("$([char]0x00AE)","")

Per uw vraagupdate:

U moet het ASCII-bestand converteren naar Unicode / UTF8 voordat u het uitvoert Import-Csv - Ik wist niet dat je dit gebruikte. Heb er allemaal naar gekeken deze en deze voor andere voorbeelden.

Misschien wil je gewoon de gedachte van het eerste CSV-bestand uitpluizen Get-Content of Export-Csv -Encoding Unicode om het bestand voor te bewerken en het leven gemakkelijker te maken.


1
2017-09-21 00:16



Bedankt. Ik wist van de methode Replace (), maar ik weet alleen hoe ik het handelsmerksymbool moet opgeven als U + 00AE. Ik zou graag willen weten hoe ik 'U + 00AE' moet speficeren als het personage dat moet worden vervangen. Ik probeerde ernaar te kijken msdn.microsoft.com/en-us/library/20bw873z.aspx maar ik zag niet hoe een individueel unicodekarakter in die specificatie moest worden gespecificeerd. - Larold
@Larold Mijn antwoord bijgewerkt. Als dat niet is wat u vraagt, laat het me dan weten. - jscott
Bedankt - Ik zal het proberen. Ik denk dat het probleem kan zijn dat de onbewerkte bits niet exact overeenkomen met wat wikipedia me vertelt dat de unicode-waarde voor het symbool is. Ik gebruik Unix's od om het onbewerkte personage in verschillende indelingen te bekijken om te bepalen waar ik naar kijk. De octale weergave van dit teken lijkt te zijn: 303 275 303 277 of in hex 0xC3 0xBD 0xC3 0xBF. Ik ga kijken of ik een regexp kan matchen met hex ... - Larold
Ok - Ik heb de onbewerkte stukjes bekeken met een Unix-programma genaamd 'od'. Het symbool waar ik op moet matchen is blijkbaar 4 bytes, dus misschien is dit een reeks van twee tekens. De onbewerkte octale weergave van dit teken lijkt te zijn: 303 275 303 277 of in hex 0xC3 0xBD 0xC3 0xBF. Wat is de juiste manier om exact die volgorde van 4 bytes aan te passen, gespecificeerd in hexadecimaal? Bedankt! - Larold
Ik heb het csv-bestand gekopieerd waarvan ik gegevens overneem, en vervolgens heb ik elk teken verwijderd, behalve het handelsmerksymbool. Bevestigd dat het 0x00ae is dat wordt opgeslagen. Het bovenstaande bericht Vervangen () lijkt helaas niet te werken. Suggesties? - Larold