2017-01-05 2 views
3

Мне было интересно, есть ли способ конвертировать языковые буквы при импорте кадра данных.Преобразование языковых писем

Я имею в виду специальные символы, такие как: ş ă î â, чтобы преобразовать их в a a a a.

На данный момент я выполняю ручную замену всех в пределах excell перед подготовкой данных для R. Я нашел код VBA, чтобы выполнять массовые замены символов или строк, однако в редакторе VBA при вводе специального Я получаю вопросительные знаки.

Мне нужно это для проекта геокодирования.

+1

Частичное решение : 'chartr ('şăîâ'," saia ", TestString)', но по крайней мере для меня консоль R не обрабатывает первые два символа. – G5W

+1

Можете ли вы прочитать файл в UTF-8, а затем заменить не само письмо, а его код UTF-8 (http://www.fileformat.info/info/charset/UTF-8/list.htm). –

ответ

1

После помощи от сообщества @cyboashu Я использую этот дешевый, но достаточно эффективный VBA макрос:

Sub replace() 
' 
Dim i As Integer 
'selecting the sheet in which to do the replacements 
Sheets("Sheet1").Select 
For i = 2 To 5 

    Cells.Replace What:=Sheet2.Cells(i, 1), Replacement:=Sheet2.Cells(i, 2), LookAt:=xlPart, _ 
     SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ 
     ReplaceFormat:=False 
    Next i 
End Sub 

Для этой работы мне пришлось создать новый лист и добавить его в оригинальной первенствует. В моем случае это называется Sheet2, и я ссылаюсь на него в цикле for, его можно расширить до большего количества символов.

Sheet2 structure

Если кто-нибудь может поделиться более заранее или оптимальные методы пожалуйста, сделайте это, и я буду с удовольствием исследовать их!

+1

Большое спасибо за упоминание меня :) :) – cyboashu

+0

Вы можете использовать специальные символы в редакторе Excel с помощью 'StrConv (« à », vbFromUnicode)' –

+0

@cyboashu Большое спасибо! – victorj

1

Диапазон символьных кодов 192..609 содержит общие 221 полукокса, которые являются представимы в ASCII (т.е. может быть преобразован из диакритических символов):

А А А А А А С Е Æ E E E Ì Í Î Ï Ñ Ò Ò Ô Õ Õ Ö Ù Ù Ù Ù ü Все права защищены. Ĺ ĺ Ļ ļ Ľ ľ Ł ł Ń ń ń ņ Ň ň Ō ō Ŏ ŏ ŏ ů Ō Ō ō Ŏ ŏ ů ů ů ū ū ū ū ů ů ů ů ū ů ů ů ů ů ů ů ů ů ů ů ů ů Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ƀ Ɖ Ƒ ƒ Ʈ Ư Ư Ư Ư Ư Ư Ư ˙U ¨z ǎ ǎ Й. Й. Ǒ ǒ Ǔ ǔ Ǖ ǖ Ǘ ǘ Ǚ ǚ Ǜ ǜ Ǟ ǟ Ǥ ǥ ǧ ǧ ǩ ǩ ǫ ǫ Ǭ ǭ ǰ ɡ

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

Sub Test() 

    ReplaceDiacritics Selection 

End Sub 

Sub ReplaceDiacritics(oTargetRange As Range) 

    Static oDiaChars As Object 
    Dim i, j, sRange, sCured, sChar, aRes 

    If oDiaChars Is Nothing Then 
     Set oDiaChars = CreateObject("Scripting.Dictionary") 
     sRange = "" 
     For i = 192 To 609 
      sRange = sRange & ChrW(i) 
     Next 
     With CreateObject("ADODB.Stream") 
      .Type = 2 
      .Mode = 3 
      .Open 
      .Charset = "ascii" 
      .WriteText sRange 
      .Position = 0 
      sCured = .ReadText 
      .Close 
     End With 
     For i = 192 To 609 
      sChar = Mid(sCured, i - 191, 1) 
      If sChar <> "?" Then oDiaChars(ChrW(i)) = sChar 
     Next 
    End If 

    If oTargetRange.Cells.Count = 1 Then 
     sRange = oTargetRange.Value 
     For Each sChar In oDiaChars 
      sRange = Replace(sRange, sChar, oDiaChars(sChar)) 
     Next 
     oTargetRange.Value = sRange 
    Else 
     aRes = oTargetRange.Value 
     For i = LBound(aRes, 1) To UBound(aRes, 1) ' rows 
      For j = LBound(aRes, 2) To UBound(aRes, 2) ' columns 
       For Each sChar In oDiaChars 
        aRes(i, j) = Replace(aRes(i, j), sChar, oDiaChars(sChar)) 
       Next 
      Next 
     Next 
     oTargetRange.Value = aRes 
    End If 

End Sub 

словарь объявлен как статический, таким образом, он заполняется при первом запуске только я тестировал код с выбором 1000 ячеек 3500 символов длиной каждый, она занимает около 8 секунд для меня. Поэтому, чтобы не повредить в течение долгого времени, лучше назвать его ReplaceDiacritics ActiveSheet.UsedRange, но не ReplaceDiacritics Cells.

0

В R (как на ваш вопрос также помечены R), вы можете использовать iconv с translitteration (однако для меня первый символ не показывает, это может зависеть от вашей операционной системы):

> iconv("ș ă î â", "UTF-8", "ASCII//TRANSLIT") 
[1] "? a i a" 
Смежные вопросы