PowerShell: замена строки не работает каждый раз?

#powershell #replace

#powershell #заменить

Вопрос:

Я пишу скрипт для подготовки csv-файла для его загрузки в SQL.

У меня есть две почти идентичные команды (1 и 3), но первая не работает, а третья работает. Ошибки нет, она просто не выполняет то, что я ожидаю от нее.

Я делаю 3 шага, сначала я избавляюсь от всех каналов в исходном файле (это то, что не работает), затем я читаю и записываю CSV (это избавляет от различной обработки с использованием кавычек и без использования кавычек, и это меняет разделитель на каналы). Наконец, я избавляюсь от всех кавычек, поскольку не должно быть других каналов, кроме разделителей.

 # ---------------------------------------------------------
# 1. Get rid of all pipes
#----------------------------------------------------------
get-content ($csvfile   ".csv") | ForEach-Object { $_ -replace "|",""} | Set-Content ($csvfile   "2.csv")

# ---------------------------------------------------------
# 2. Make standard CSV but use Pipes as delimiter
#----------------------------------------------------------
Import-csv -path ($csvfile   "2.csv") -Delimiter ',' | Export-CSV -path ($csvfile   " 3.csv") -Delimiter '|'

# ---------------------------------------------------------
# 3. Get rid of all Quotes
#----------------------------------------------------------
get-content ($csvfile   "3.csv") | ForEach-Object { $_ -replace '"',""} | Set-Content ($csvfile   "4.csv")
  

Части удаления одинаковы. Второй вариант работает, он удаляет все кавычки, но первый не работает, каналы все еще включены. Я пробовал разные символы, но по какой-то причине ни один из них не работает в этой позиции.

Чего мне не хватает?

Спасибо!

Ответ №1:

Просто экранируйте | символ с помощью like | , как показано ниже, и он будет работать нормально; причина | — специальный символ (символ командной строки).

 get-content ($csvfile   ".csv") | ForEach-Object { $_ -replace "|",""} | 
Set-Content ($csvfile   "2.csv")
  

Итак, если у меня есть ввод типа dadad|xcvxvv|sdffgfg then после команды, вывод будет выглядеть так dadadxcvxvvsdffgfg

Комментарии:

1. Большое вам спасибо! Это было так. Мне жаль, что я не подумал об этом раньше.