У меня есть список имен файлов в электронной таблице в виде "Smith, J. 010112.pdf". Однако они находятся в разных форматах "010112.pdf", "01.01.12.pdf" и "1.01.2012.pdf". Как я могу изменить их в один формат "010112.pdf"?
Как нормализовать имена файлов, перечисленных в диапазоне
Ответ 1
Лично я ненавижу использование VBA, где работают рабочие листы, поэтому я разработал способ сделать это с помощью функций листа. Хотя вы могли бы втиснуть все это в одну ячейку, я разбил ее на множество независимых шагов в отдельных столбцах, чтобы вы могли видеть, как она работает, шаг за шагом.
Для простоты я предполагаю, что ваше имя файла находится в A1
B1= LEN (A1)
определить длину имени файла
C1= ЗАМЕСТИТЕЛЬ (A1, "," ")
замените пробелы ничем
D1= LEN (C1)
посмотрите, как долго строка будет, если вы замените пробелы ничем.
E1= B1-D1
определить, сколько пробелов есть
F1= ЗАМЕСТИТЕЛЬ (A1, "", CHAR (8), E1)
замените последнее пространство специальным символом, который не может произойти в имени файла
G1= ПОИСК (CHAR (8), F1)
найдите специальный символ. Теперь мы знаем, где последнее пространство
H1= LEFT (A1, G1-1)
отделите все до последнего пробела
I1= MID (A1, G1 + 1,255)
скрыть все после последнего пробела
J1= НАЙТИ ( "." , I1)
найдите первую точку
K1= НАЙТИ ( "." , I1, J1 + 1)
найти вторую точку
L1= НАЙТИ ( "." , 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= ТЕКСТ (M1, "00" )
pad первое число
Q1= ТЕКСТ (N1, "00" )
введите второе число
R1= ТЕКСТ (O1, "00" )
введите третье число
S1= IF (ISERR (K1), M1, P1 & Q1 & R1)
поместите числа вместе
T1= H1 & "& S1 &". pdf"
все вместе
Это вроде беспорядок, потому что Excel не добавил ни одной новой функции манипуляции с строкой более 20 лет, поэтому все, что должно быть легко (например, "найти последнее пространство" ), требует серьезного обмана.
Ответ 2
Вот скриншот простого четырехэтапного метода на основе команд и формул Excel, как это предлагается в комментарии к ответу (с несколькими изменениями)...
Ответ 3
Эта функция ниже работает. Я предположил, что дата находится в формате 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"
.
Ответ 4
Вам не нужен VBA. Начните с замены "." S ничем:
=SUBSTITUTE(A1,".","")
Это изменит ".PDF" на "PDF", поэтому вернем это:
=SUBSTITUTE(SUBSTITUTE(A1,".",""),"pdf",".pdf")
Ответ 5
ОТКАЗ:
Как отметил Жан-Франсуа Корбетт, это не работает для "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 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
Ответ 6
Получил awk? Получите данные в текстовый файл и
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
Предполагая, что данные в точности соответствуют тому, что вы описали, например,
Смит, J. 010112.pdf
Мит, Х. 01.02.12.pdf
Excel, M. 8.1.1989.pdf
Lec, X. 06.28.2012.pdf