我在电子表格中有一个文件名列表,格式为“Smith, J. 010112.pdf”。但是,它们采用“010112.pdf”、“01.01.12.pdf”和“1.01.2012.pdf”等不同格式。我怎样才能将这些更改为“010112.pdf”的一种格式?
6 回答
就我个人而言,我讨厌在工作表函数可以工作的地方使用 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 多年来没有添加一个新的字符串操作函数,所以应该很容易的事情(比如“找到最后一个空格”)需要严重的诡计。
这是基于 Excel 命令和公式的简单四步方法的屏幕截图,正如对已回答帖子的评论中所建议的那样(有一些更改)...
下面的这个功能有效。我假设日期是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"
。
你不需要VBA。首先将“.”替换为空:
=SUBSTITUTE(A1,".","")
这会将“.PDF”更改为“PDF”,所以让我们把它放回去:
=SUBSTITUTE(SUBSTITUTE(A1,".",""),"pdf",".pdf")
免责声明:
正如@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
有吗?将数据放入文本文件中,然后
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