转换特定语言的字母

时间:2017-01-05 19:35:30

标签: r vba

我想知道在导入数据框时是否有办法转换特定于语言的字母。

我的意思是特殊的字符,如:şăî被转换为s a i a。

现在我正在做的是在为R准备数据之前在excell内执行手动替换。我找到了一个VBA代码来进行字符或字符串的批量替换,但是在VBA编辑器中输入特殊字符时我收到了问号。

我需要这个地理编码项目。

3 个答案:

答案 0 :(得分:1)

char代码192..609的范围包含可用ASCII表示的总共221个字符(即可以从变音字符转换):

  

ÀÃÃÃââËËÏÏÏÏ¢Ô¢Ô¢ÔÔÕÔÕÔÕ†óôöøúúúúĂĄąćĈĉĊċċďďďĐēēēĕĖĘĘĚĝĞĞĞĞĠġģĤĥĥĥ更多信息šŢŤťŦŧŨŪŬŭŮŰűŲųŵŶŷŹðŽŽƀƉƑƗƗƚƠơƫƮƯưưƶǍǏǐǐǒ ǓǔǕǗǘǙǚǜǞǟǤǥǦǧǨǩǪǬǬɡɡɡ

一般情况下,您可以不使用辅助工作表,使用可替换的字符填充字典,如下面的代码:

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

答案 1 :(得分:0)

在社区@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

为此,我必须创建一个新工作表并将其添加到原始的Excel中。在我的情况下,它被称为Sheet2,我在for循环中引用它,它可以扩展为更多的字符。

Sheet2 structure

如果有人可以分享更多先进或最佳方法,请这样做,我很乐意探索它们!

答案 2 :(得分:0)

在R中(因为你的问题也用R标记)你可以使用iconv进行翻译(但对我来说,第一个角色没有显示,可能取决于你的操作系统):

> iconv("ș ă î â", "UTF-8", "ASCII//TRANSLIT")
[1] "? a i a"