10

我在电子表格中有一个文件名列表,格式为“Smith, J. 010112.pdf”。但是,它们采用“010112.pdf”、“01.01.12.pdf”和“1.01.2012.pdf”等不同格式。我怎样才能将这些更改为“010112.pdf”的一种格式?

4

6 回答 6

25

就我个人而言,我讨厌在工作表函数可以工作的地方使用 VBA,所以我想出了一种用工作表函数来做到这一点的方法。尽管您可以将所有这些都塞进一个单元格中,但我已将其分解为单独列中的许多独立步骤,以便您可以逐步了解它是如何工作的。

为简单起见,我假设您的文件名在 A1 中

B1 =LEN(A1)
确定文件名的长度

C1 =SUBSTITUTE(A1," ","")
将空格替换为空

D1 =LEN(C1)
如果你用空替换空格,看看字符串有多长

E1 =B1-D1
确定有多少个空格

F1 =SUBSTITUTE(A1," ",CHAR(8),E1)
用文件名中不能出现的特殊字符替换最后一个空格

G1 =SEARCH(CHAR(8), F1)
查找特殊字符。现在我们知道最后一个空格在哪里

H1 =LEFT(A1,G1-1)
剥离最后一个空格之前的所有内容

I1 =MID(A1,G1+1,255)
剥离最后一个空格后的所有内容

J1 =FIND(".",I1)
找到第一个点

K1 =FIND(".",I1,J1+1)
找到第二个点

L1 =FIND(".",I1,K1+1)
找到第三个点

M1 =MID(I1,1,J1-1)
求第一个数

N1 =MID(I1,J1+1,K1-J1-1)
求第二个数

O1 =MID(I1,K1+1,L1-K1-1)
求第三个数

P1 =TEXT(M1,"00")
填充第一个数字

Q1 =TEXT(N1,"00")
填充第二个数字

R1 =TEXT(O1,"00")
填充第三个数字

S1 =IF(ISERR(K1),M1,P1&Q1&R1)
将数字放在一起

T1 =H1&" "&S1&".pdf"
放在一起

这有点乱,因为 Excel 20 多年来没有添加一个新的字符串操作函数,所以应该很容易的事情(比如“找到最后一个空格”)需要严重的诡计。

于 2012-06-28T15:33:59.087 回答
7

这是基于 Excel 命令和公式的简单四步方法的屏幕截图,正如对已回答帖子的评论中所建议的那样(有一些更改)...

在此处输入图像描述

于 2012-06-29T14:50:52.020 回答
6

下面的这个功能有效。我假设日期是ddmmyy格式的,但如果是,请酌情调整mmddyy——我无法从你的例子中看出。

Function FormatThis(str As String) As String

    Dim strDate As String
    Dim iDateStart As Long
    Dim iDateEnd As Long
    Dim temp As Variant

    ' Pick out the date part
    iDateStart = GetFirstNumPosition(str, False)
    iDateEnd = GetFirstNumPosition(str, True)
    strDate = Mid(str, iDateStart, iDateEnd - iDateStart + 1)

    If InStr(strDate, ".") <> 0 Then
        ' Deal with the dot delimiters in the date
        temp = Split(strDate, ".")
        strDate = Format(DateSerial( _
            CInt(temp(2)), CInt(temp(1)), CInt(temp(0))), "ddmmyy")
    Else
        ' No dot delimiters... assume date is already formatted as ddmmyy
        ' Do nothing
    End If

    ' Piece it together
    FormatThis = Left(str, iDateStart - 1) _
        & strDate & Right(str, Len(str) - iDateEnd)
End Function

这使用以下辅助函数:

Function GetFirstNumPosition(str As String, startFromRight As Boolean) As Long
    Dim i As Long
    Dim startIndex As Long
    Dim endIndex As Long
    Dim indexStep As Integer

    If startFromRight Then
        startIndex = Len(str)
        endIndex = 1
        indexStep = -1
    Else
        startIndex = 1
        endIndex = Len(str)
        indexStep = 1
    End If

    For i = startIndex To endIndex Step indexStep
        If Mid(str, i, 1) Like "[0-9]" Then
            GetFirstNumPosition = i
            Exit For
        End If
    Next i
End Function

去测试:

Sub tester()

    MsgBox FormatThis("Smith, J. 01.03.12.pdf")
    MsgBox FormatThis("Smith, J. 010312.pdf")
    MsgBox FormatThis("Smith, J. 1.03.12.pdf")
    MsgBox FormatThis("Smith, J. 1.3.12.pdf")

End Sub

他们都回来了"Smith, J. 010312.pdf"

于 2012-06-28T08:30:00.597 回答
2

你不需要VBA。首先将“.”替换为空:

 =SUBSTITUTE(A1,".","")

这会将“.PDF”更改为“PDF”,所以让我们把它放回去:

 =SUBSTITUTE(SUBSTITUTE(A1,".",""),"pdf",".pdf")
于 2012-06-27T20:35:09.673 回答
1

免责声明:

正如@Jean-FrançoisCorbett 所提到的,这不适用于"Smith, J. 1.01.12.pdf". 我建议不要完全修改这个,而是推荐他的解决方案!

Option Explicit

Function ExtractNumerals(Original As String) As String
'Pass everything up to and including ".pdf", then concatenate the result of this function with ".pdf". 
'This will not return the ".pdf" if passed, which is generally not my ideal solution, but it's a simpler form that still should get the job done. 
'If you have varying extensions, then look at the code of the test sub as a guide for how to compensate for the truncation this function creates.
Dim i As Integer
Dim bFoundFirstNum As Boolean

    For i = 1 To Len(Original)
        If IsNumeric(Mid(Original, i, 1)) Then
            bFoundFirstNum = True
            ExtractNumerals = ExtractNumerals & Mid(Original, i, 1)
        ElseIf Not bFoundFirstNum Then
            ExtractNumerals = ExtractNumerals & Mid(Original, i, 1)
        End If
    Next i

End Function

我用它作为一个测试用例,它没有正确涵盖你所有的例子:

Sub test()

MsgBox ExtractNumerals("Smith, J. 010112.pdf") & ".pdf"

End Sub
于 2012-06-27T20:33:31.120 回答
1

有吗?将数据放入文本文件中,然后

awk -F'.' '{ if(/[0-9]+\.[0-9]+\.[0-9]+/) printf("%s., %02d%02d%02d.pdf\n", $1, $2, $3, length($4) > 2 ? substr($4,3,2) : $4); else print $0; }' your_text_file

假设数据与您描述的完全一样,例如,

Smith, J. 010112.pdf
Mit, H. 01.02.12.pdf
Excel, M. 8.1.1989.pdf
Lec, X. 06.28.2012.pdf

于 2012-06-28T17:47:46.540 回答