Удалить пробел из 5-го столбца только в текстовом файле - PullRequest
3 голосов
/ 29 марта 2019

У меня есть текстовый файл, поступающий из API, и мне нужно удалить пробел только из определенного столбца (5-й столбец)

пример:

"Number"|"Message"|"Reference"|"SendFrom"|"CampaignName"
"4478xxxxxxxx"|"Test message from test system"|"104"|"dunno"|"Campaign Name Here 2"
"4479xxxxxxxx"|"Test message from test system"|"105"|"dunno"|"Campaign Name Here 2"

Мне нужновывод будет следующим:

"Number"|"Message"|"Reference"|"SendFrom"|"CampaignName"
"4478xxxxxxxx"|"Test message from test system"|"104"|"dunno"|"CampaignNameHere2"
"4479xxxxxxxx"|"Test message from test system"|"105"|"dunno"|"CampaignNameHere2"

, поэтому только последний столбец удаляет из него пробел, а не остальную часть файла.

Мне удалось выделить последний столбеци удалите пробел:

$columnToGet4 = 4
$columns4 = gc $Report | 
   %{ $_.Split("|",[StringSplitOptions]"RemoveEmptyEntries")[$columnToGet4] }

$columns4 = $columns4 -replace '\s',''

, но попытка связать данные обратно не сработала.

Любой совет, как это можно сделать?

спасибо

Ответы [ 4 ]

1 голос
/ 29 марта 2019

при условии, что символы канала являются разделителями, а не просто отображаемым маркером, это делает работу ... [ ухмылка ]

# fake reading in a CSV file
#    in real life, use Import-CSV -Delimiter '|'
$InStuff = @'
"Number"|"Message"|"Reference"|"SendFrom"|"CampaignName"
"4478xxxxxxxx"|"Test message from test system"|"104"|"dunno"|"Campaign Name Here 2"
"4479xxxxxxxx"|"Test message from test system"|"105"|"dunno"|"Campaign Name Here 2"
'@ | ConvertFrom-Csv -Delimiter '|'

foreach ($IS_Item in $InStuff)
    {
    $IS_Item.CampaignName = $IS_Item.CampaignName.Replace(' ', '')
    }

# on screen
$InStuff

# send to CSV file
$ECSV_Params = @{
    LiteralPath = "$env:TEMP\Pablo_Beezo_-_DeSpacedCampaignNameVersion.csv"
    Delimiter = '|'
    NoTypeInformation = $True
    }
$InStuff |
    Export-Csv @ECSV_Params

на экране ...

Number       : 4478xxxxxxxx
Message      : Test message from test system
Reference    : 104
SendFrom     : dunno
CampaignName : CampaignNameHere2

Number       : 4479xxxxxxxx
Message      : Test message from test system
Reference    : 105
SendFrom     : dunno
CampaignName : CampaignNameHere2

Содержимое файла CSV ...

"Number"|"Message"|"Reference"|"SendFrom"|"CampaignName"
"4478xxxxxxxx"|"Test message from test system"|"104"|"dunno"|"CampaignNameHere2"
"4479xxxxxxxx"|"Test message from test system"|"105"|"dunno"|"CampaignNameHere2"
1 голос
/ 29 марта 2019

Для этого вы можете использовать обработку CSV в PowerShell:

# Import the file as if it was a CSV separated by the pipe,
# and process each row

Import-Csv -LiteralPath 'c:\temp\input.txt' -Delimiter '|' | 
ForEach-Object {

    # Replace spaces in the campaignName column, by name
    $_.CampaignName = $_.CampaignName -replace '\s'

    # and output the changed row item, for export to file
    $_

} | Export-Csv -LiteralPath 'c:\temp\output.txt' -Delimiter '|' -NoTypeInformation

Или обработка простого текста и регулярное выражение заменить:

Get-Content -LiteralPath 'c:\temp\input.txt' | ForEach-Object {
    $_ -replace '\s(?=[^|]+$)'
} | Set-Content -LiteralPath 'c:\temp\output.txt' -Encoding ASCII

Там, где регулярное выражение выбирает «пробелы, в которых больше не будет каналов на линии впоследствии» (возможно, это неверное предположение).

Или вы можете использовать обычную обработку текста, выбирая, где находится последний символ канала:

Get-Content -LiteralPath 'c:\temp\input.txt' | foreach-object {

    $afterLastPipe = $_.lastindexof('|')+1

    $_.Substring(0, $afterLastPipe) + $_.Substring($afterLastPipe).Replace(' ', '')

} | Set-Content...

Опять же, может быть неверным предположение, что больше нет каналов, особенно если они могут быть внутри кавычек.

0 голосов
/ 29 марта 2019

Это однострочник:

Import-Csv -Path $source -Delimiter '|' -Encoding UTF8 | % { $_.CampaignName = $_.CampaignName.Replace(' ',''); $_ } | Export-Csv $dest -NoTypeInformation -Delimiter '|'
0 голосов
/ 29 марта 2019

Может быть, это немного разъясняет происходящее:

$Report = Get-Content ./Data.txt

$Result = foreach ($R in $Report) {
    # Split the original text string into pieces, an array
    $OriginalArray = $R.Split('|')

    # Only execute when there are 4 elements
    if ($OriginalArray.Count -ge 5) {
       # Remove the spaces of the 4th element in the array
       $UpdatedValue = $OriginalArray[4] -replace '\s'

       # Update the original value
       $OriginalArray[4] = $UpdatedValue
    }

    # Join the array back together into one string
    $OriginalArray -join '|'
}

$Result

# Export the data to a file
$Result | Out-File .File.txt -Encoding UTF8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...