Есть ли способ просто заменить строковые элементы, содержащие escape-символы - PullRequest
0 голосов
/ 28 октября 2019

Из файла я импортирую строки. В этой строке (экранированная) строка является частью строки:

DP,0,"021",257
DP,1,"022",257
DP,2,"023",513
DP,3,"024",513
DP,4,"025",1025
DP,5,"026",1025
DP,6,"081",257
DP,7,"082",257
DP,8,"083",513
DP,9,"084",513
DP,10,"085",1025
DP,11,"086",1025
DP,12,"087",1025
DP,13,"091",257
DP,14,"092",513
DP,15,"093",1025
IS,0,"FIX",0
IS,1,"KARIN02",0
IS,2,"KARUIT02",0
IS,3,"KARIN02HOV",0
IS,4,"KARUIT02HOV",0
IS,5,"KARIN08",0
IS,6,"KARUIT08",0
IS,7,"KARIN08HOV",0
IS,8,"KARUIT08HOV",0
IS,9,"KARIN09",0
IS,10,"KARUIT09",0
IS,11,"KARIN09HOV",0
IS,12,"KARUIT09HOV",0
IS,13,"KARIN10",0
IS,14,"KARUIT10",0
IS,15,"KARIN10HOV",0

Я получаю следующие объекты (если DP):

index - parts1 (int)
name  - parts2 (string)
ref   - parts3 (int)

Я пытался использовать REGEX для замены excape-последовательность из строк, но безрезультатно

@name_to_ID = {}
kruising = 2007
File.open(cfgFile).each{|line|
    parts = line.split(",")
    if parts[0]=="DP"
      index = parts[1].to_i
      hex = index.to_s(16).upcase.rjust(2, '0')
      cname = parts[2].to_s
      tname = cname.gsub('\\"','')
      p "cname= #{cname} (#{cname.length})"
      p "tname= #{tname} (#{tname.length})"
      p cname == tname
      @name_to_ID[tname] = kruising.to_s + "-" + hex.to_s
    end
  }

teststring = "021"
p @name_to_ID[teststring]
> "021" (5) 
> "021" (5)
> true
> nil

Проблема обнаружилась при вызове из другой строковой ссылки (length3)

hash [key] не равен string "021 "(длина 5) не является строкой 021 (длина 3)

любой метод, который фактически заменяет символы, которые мне нужны?

РЕДАКТИРОВАТЬ: я использовал

cname.each_char{|c|
  p c
}

> "\""
> "0" 
> "2"
> "1"
> "\""

РЕДАКТИРОВАТЬ: запрашиваемое обновление результатов:

# Current output:
@name_to_ID["021"] = 2007-00 "021".length = 5
@name_to_ID["022"] = 2007-01 "022".length = 5
@name_to_ID["081"] = 2007-06 "081".length = 5
@name_to_ID["082"] = 2007-07 "082".length = 5
@name_to_ID["091"] = 2007-0D "091".length = 5
@name_to_ID["101"] = 2007-10 "101".length = 5
# -------------
# Expected output: 
@name_to_ID["021"] = 2007-00 "021".length = 3
@name_to_ID["022"] = 2007-01 "022".length = 3
@name_to_ID["081"] = 2007-06 "081".length = 3
@name_to_ID["082"] = 2007-07 "082".length = 3
@name_to_ID["091"] = 2007-0D "091".length = 3
@name_to_ID["101"] = 2007-10 "101".length = 3

1 Ответ

0 голосов
/ 28 октября 2019

Ваша проблема в том, что вы не знаете правильный символ в вашей строке. Это может быть не тот же символ при его печати. ​​

Попробуйте parts[2].to_s.bytes, чтобы точно проверить, каков код этого неожиданного символа. Например:

 > "͸asd".bytes
 => [205, 184, 97, 115, 100]

В качестве альтернативы вы можете удалить первый и последний символы, если уверены, что каждая часть строки имеет одинаковый формат:

cname = parts[2].to_s[1..-2]

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

cname = parts[2].to_s.gsub(/[^0-9A-Za-z]/, '')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...