【问题标题】:Clean data in excel that comes in varying formats清理 excel 中不同格式的数据
【发布时间】:2022-12-21 08:30:06
【问题描述】:

我有一个包含这些格式的值的 excel 表。这些表跨越 30000 多个条目。
我需要清理这些数据,以便只留下 V- 之后的数字。这意味着当值为 SV-51140r3_rule、V-4407...时,我只想保留 4407,而当值为 SV-245744r822811_rule 时,我只想保留 245744。我有大约 10 个公式可以处理这些变化,但它需要大量的体力劳动。我也使用了 excel 的文本到列功能来清理这些数据,但是浏览整个文档大约需要 30 分钟到一个小时。我正在寻找可以简化此过程的方法,以便一个公式或函数可以处理所有这些不同的变化。我对使用 VBA 持开放态度,但没有太多的经验,而且我无法使用 Pandas 或任何 IDE 或编程语言。请帮助!!

我已经使用文本到列来以这种方式清理数据,并且我使用了这个公式的变体

=IFERROR(RIGHT(A631,LEN(A631)-FIND("#",SUBSTITUTE(A631,"-","#",LEN(A631)-LEN(SUBSTITUTE(A631,"-",""))))),A631)

【问题讨论】:

  • Ariel 你的 excel 版本是什么?从图中看不清楚你的数据模式,末尾的分隔符是什么(空格,下划线)?谢谢,请提供有关输入和预期输出的更多详细信息。请尽量以markdown表格形式提供。检查这个:Table Markdown Generator

标签: excel data-cleaning data-conversion


【解决方案1】:

根据您的 Excel 版本,这些都应该有效。如果你有能力使用 Let 函数,它将提高你的性能,as this outstanding article 明确表示。

如果您使用的是非常旧的 excel 版本,则需要按 ctl shift enter 才能使数组公式起作用。

虽然这些看起来令人生畏,但所有这些函数所做的就是找到最后一个V(通过这个函数)=SUBSTITUTE(RIGHT(SUBSTITUTE(A2,"V",REPT("?",999)),999),"?",""),然后遍历每个字符并只返回数字。

显然,蘑菇?可以是人们认为不可能出现在实际数据中的任何字符。

老套

=TEXTJOIN("",TRUE,IF(ISNUMBER(MID(MID(SUBSTITUTE(RIGHT(SUBSTITUTE(A2,"V",REPT("?",999)),999),"?",""),
FIND("-",SUBSTITUTE(RIGHT(SUBSTITUTE(A2,"V",REPT("?",999)),999),"?","")),9^9),
FILTER(COLUMN($1:$1),COLUMN($1:$1)<=LEN(MID(SUBSTITUTE(RIGHT(SUBSTITUTE(A2,"V",REPT("?",999)),999),"?",""),
FIND("-",SUBSTITUTE(RIGHT(SUBSTITUTE(A2,"V",REPT("?",999)),999),"?","")),9^9))),1)+0),
MID(MID(SUBSTITUTE(RIGHT(SUBSTITUTE(A2,"V",REPT("?",999)),999),"?",""),
FIND("-",SUBSTITUTE(RIGHT(SUBSTITUTE(A2,"V",REPT("?",999)),999),"?","")),9^9),
FILTER(COLUMN($1:$1),COLUMN($1:$1)<=LEN(MID(SUBSTITUTE(RIGHT(SUBSTITUTE(A2,"V",REPT("?",999)),999),"?",""),
FIND("-",SUBSTITUTE(RIGHT(SUBSTITUTE(A2,"V",REPT("?",999)),999),"?","")),9^9))),1),""))

让函数

(如果可以的话就用这个)

=LET(zText,SUBSTITUTE(RIGHT(SUBSTITUTE(A2,"V",REPT("?",999)),999),"?",""),
TEXTJOIN("",TRUE,IF(ISNUMBER(MID(MID(zText,FIND("-",zText),9^9),
FILTER(COLUMN($1:$1),COLUMN($1:$1)<=LEN(MID(zText,FIND("-",zText),9^9))),1)+0),
MID(MID(zText,FIND("-",zText),9^9),
FILTER(COLUMN($1:$1),COLUMN($1:$1)<=LEN(MID(zText,FIND("-",zText),9^9))),1),"")))

VBA 自定义函数

您还可以使用 VBA 自定义函数来完成您想要的。

Function getNumbersAfterCharcter(aCell As Range, aCharacter As String) As String
    Const errorValue = "#NoValuesInText"
    Dim i As Long, theValue As String
    
        For i = Len(aCell.Value) To 1 Step -1
            theValue = Mid(aCell.Value, i, 1)
            If IsNumeric(theValue) Then
                getNumbersAfterCharcter = Mid(aCell.Value, i, 1) & getNumbersAfterCharcter
            ElseIf theValue = aCharacter Then
                Exit Function
            End If
        Next i
    If getNumbersAfterCharcter = "" Then getNumbersAfterCharcter = errorValue
End Function

【讨论】:

  • 唯一的问题是 V-#### 有时在最前面,有时在中间,有时在最后。
  • 我提供的答案解决了您所代表的情况(请参阅屏幕截图中的第 5 行),这意味着您的适当回应将是 accept 答案或指出我的答案如何没有解决您的原始问题。如果您没有在问题中包含某些条件,我建议您重新发布一个更清楚的新问题。
猜你喜欢
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
相关资源
最近更新 更多