Как нормализовать имена файлов, перечисленных в диапазоне

У меня есть список имен файлов в электронной таблице в виде "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, как это предлагается в комментарии к ответу (с несколькими изменениями)...

enter image description here

Ответ 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