我知道使用clean
公式,我可以清理一些非 ASCII 字符(例如除 #127 之外的其他不可打印 ASCII 控制字符 #0 到 #31、#129、#141、#143、#144 和 #157)
我还知道我可以用它SUBSTITUTE(D1,CHAR(127),"")
来删除不可打印的 ASCII #127。
但是,我无法替换或识别 Excel 单元格内的非 ASCII 字符。
以下是一个简单的例子:
Burrell's Model
Burrell’s Model
请注意,第一行是普通 ASCII 字符串,而第二行包含非 ASCII 字符(撇号)。
我可以知道如何使用 Excel 查找非 ASCII 字符吗?
谢谢。
更新 1
根据 Bandrami 的评论如下:
In the broadest sense this is impossible; there are valid ASCII strings that are also valid UTF characters, so there's no way to ever know "for certain" (see the "Bush hid the facts" bug: en.wikipedia.org/wiki/Bush_hid_the_facts )
请问如何识别不属于以下 ASCII 范围的字符?
- 小于 128
- 不等于 255
答案1
MS Office 帮助似乎将撇号视为 CLEAN 应该捕获的字符,但它并没有在我的计算机上将其删除。
MS Office 帮助,从文本倒数第二段中删除空格和非打印字符
我发现最“简单”的方法是嵌套运行 SUBSTITUTE,它可以清除 CLEAN 函数无法捕获的所有内容。
=SUBSTITUTE(SUBSTITUTE(F17,CHAR(141),""),CHAR(143),"") etc etc
答案2
好吧,这是“真正的 ASCII”部分的方法,可以对 255 和 127 进行轻微调整。它最多可检查单元格文本中的 10 个字符,但可以轻松地将其设置为任意长度,尽管如果检查每个单元格中的 20,000 个字符,而不是根据您的判断检查较小的、可能的数字,则需要更多时间运行。此外,它检查单元格 A1 时会考虑您要填充一列以匹配,因此如果要检查的文本在 A1:A20000 中,您将在 B1:B20000 中输入公式。(我还没有研究过是否可以以触发溢出的方式使用它,以便它为您填充列,而不必复制和粘贴。)
=TEXTJOIN("",TRUE,IFERROR(CHAR(IF(UNICODE(MID(A1,ROW(1:10),1))>127,"",UNICODE(MID(A1,ROW(1:10),1)))),""))
基本上,它使用UNICODE()
函数(不是CODE()
因为可能存在不在 <255 范围内的字符)来读取被检查的单元格中的每个字符。MID()
用于一次隔离一个字符(最后一个参数的长度为 1),我们检查每个字符的方式是ROW(1:whatever number you choose)
给它一个不止一个的起点。
然后我们测试结果与 127 的对比,为任何不在真实 ASCII 集中的字符生成“”。然后我们重新创建字符(CHAR()
,我们可以安全地使用,因为没有它不能正确处理的结果。)以获得成功的结果,对于所有“”。这些错误由 处理,IFERROR()
将它们重新变为“”。最后,TEXTJOIN()
将它们连接在一起以给出我们想要的单个结果,而不是SPILLING
。
结果将为文本,但如果有单元格应为数字,则可以进一步处理它,方法是将其包装起来VALUE()
以获取实际值或错误,然后IFERROR()
在`VALUE() 失败时给出原始文本结果。因此,可能是数字的东西会以数字形式显示,其余的则以文本形式显示。
如果需要,可以使用 VBA 按照这种方法删除任何非 ASCII 数据(true 或 <=255,以二者为准),因为如果没有其他方法,VBA 始终可以运行您可以在单元格中写入的任何公式。这将使其透明(没有辅助列),并且 VBA 还可以将结果直接写入原始数据,这对于导入的数据(因此如果出现问题,仍可以原始形式使用)来说是一个不错的功能。对于输入的数据(如果出现问题,则无法重新加载)来说,这个功能不太好...
它还可以很容易地适应几种方式,以测试所选字符列表,而不是所有>127或>255的字符。或者可以适应保留特定字符。
答案3
将其转储到 csv 并通过 unix 命令 cat -v 运行。非 ASCII 字符将以 M- 符号显示,因此只需 grep 查找 M- 即可。
答案4
我不完全清楚你想要什么,虽然你清楚地说明了工作表函数,但我提供这个 VBa 代码,因为它可能将更加可定制...
根据ASCII,它’
的十进制值大于 127(实际值无关紧要)...所以,此代码检查每个字符的值,如果大于 127,则将其标记...这意味着您需要查看链接以查看哪些字符是可以使用的“OK”字符。
Sub Sheet2_Button1_Click()
Dim rCell As Range
Dim rRng As Range
Set rRng = Range("A1:D8")
For Each rCell In rRng.Cells
Debug.Print rCell.Address & " --- " & rCell.Value
Dim s As String
s = rCell.Value
For i = 1 To Len(s)
Dim c2 As String
Dim ascInt As Integer
c2 = Mid(s, i, 1)
ascInt = asc(Mid(s, i, 1))
If (ascInt > 127) Then
MsgBox ("Cell " & rCell.Address & " has a " & c2)
End If
Next i
Next rCell
End Sub
因此,如您所见,我在一张小表格中使用了 2 个示例。我运行宏,每次出现该字符时,它都会显示在消息框中