Может сработать регулярное выражение, соответствующее шестнадцатеричному значению символа. Наивный подход состоит в том, чтобы просто заменить любой недопустимый символ на тот, который работает. Обычно -
используется как символ
В качестве примера данных рассмотрим некоторые бессмысленные CSV, содержащие японские и европейские буквы åäöè
:
id,data
1,Lorem内ょへconsectetur
2,ipsum 球経風adipiscing
3,dolor
4,sitåäöèelit
5,amet
Импортируйте файл как CSV, пройдитесь по циклу и замените каждый не-ASCII символ, скажем, тире. Регулярное выражение [^\x00-\x7A]
будет соответствовать символам с шестнадцатеричным значением от 00 до 122 или от nul
до z
. В зависимости от вашего варианта использования настройте диапазон соответствующим образом. Вот так
$data = Import-Csv C:\temp\mixed.csv
$data | % {
$_.data = $_.data -replace "[^\x00-\x7A]","-"
}
$data
# Output
id data
-- ----
1 Lorem---consectetur
2 ipsum ---adipiscing
3 dolor
4 sit-----elit
5 amet
Этот подход имеет существенный недостаток: он теряет информацию. Рассмотрим следующие данные:
1,sensor-内
2,sensor-ょ
3,sensor-へ
Выходные данные просто разделили бы кандзи, поэтому было бы три элемента, содержащих sensor--
. Если это не хорошо, решите, какой тип преобразования необходим для символов, не относящихся к ASCII. Преобразовать значения в обычный гекс? Пропустить это вообще? Транслитерировать на латинский алфавит?