Extraindo data de uma string sem padrão

1

Recentemente, comecei a trabalhar em uma planilha de excel que depende de uma cadeia de descrição postada no banco de dados oracle.

A string é mais ou menos assim

1 year Rent Charges for Parking for the Period of 18-8-1438 to 17-8-1439 / 15-5-17 to 4-5-18

6 months rent charges for Street from 01-08-1438 to 01-02-1439 / 28-04-2017 to 21-10-2017

1Year rent charges for 310113- Outlet for the period of 01-01-1438 to 30-12-1438

e qualquer outra forma com a qual a pessoa que postou a descrição se sente confortável.

Agora, minha pergunta é como extrair as datas dessas descrições facilmente através da função excel ou de uma macro vba. O bônus seria converter as datas islâmicas em gregoriano imediatamente, em vez de convertê-las em um serviço da Web.

Editar: Esqueci de mencionar a saída desejada (graças a Mate Juhasz), a saída precisa ser algo que pode ser usado na fórmula days360, como mm / dd / aaaa. Haverá principalmente 2 datas em cada entrada, data de início do contrato e data de término do contrato, com a possibilidade de o mesmo ser postado junto com o hijri e raramente apenas a data hijri. Sempre verifique se há dd / mm / aaaa ou dd / mm / aa, como é o formato de postagem usual.

    
por Herubrand 28.11.2017 / 12:54

3 respostas

0

1. extrair datas

Eu uso o suplemento RegEx Find / Replace desses casos, o que adiciona a funcionalidade de expressão regular ao Excel .

Você pode usá-lo também como uma fórmula de matriz:

  • Como você espera no máximo quatro datas por célula, selecione quatro células em uma linha (por exemplo, B3: E3 no exemplo)
  • Fórmula de tipo
  • :
    =RegExFind(A3,"\d+-\d+-\d+")
  • pressione CTRL + Shift + Enter
  • copiar a fórmula para baixo

Isso procurará todas as datas inseridas como 1/2 dígito dia / mês e 2/4 dígitos do ano, partes separadas por um único -

2. converter textos extraídos para datas

Nos exemplos que usei DATEVALUE functions, que funciona apenas para o calendário gregoriano, não tenho experiência com hijri.

    
por 28.11.2017 / 14:35
0

Nos exemplos que você deu, segue um padrão.

O padrão é: pelo menos um dígito, seguido por um símbolo que seja um traço ou uma barra. (x2) e terminando em 2 ou 4 dígitos. E eles estão todos na mesma linha.

Você pode usar o regex para retornar todos os resultados correspondentes a esse padrão. Meu regex está um pouco enferrujado, mas o padrão seria algo como:

\d{1,2}[\/-]\d{1,2}[\/-]\d{2,4}

Isso corresponderia, por exemplo, ao formato DD / MM / AAAA, bem como ao formato D-M-AA e às permutações do mesmo.

Se você quiser analisar o formato de data de / para , use esta string de pesquisa:

\d{1,2}[\/-]\d{1,2}[\/-]\d{2,4}\s*to\s*\d{1,2}[\/-]\d{1,2}[\/-]\d{2,4}

É claro que você precisaria executá-lo por meio de um mecanismo de expressão regular e coletar a saída.

Então você pode querer padronizar a saída para que tudo corresponda a um formato DD / MM / AAAA - embora eu tenha que dizer que prefiro YYYY-MM-DD como os computadores indexam coisas para pesquisas. Você pode fazer isso com regex também, agrupando números e reorganizando-os com pesquisa e substituição. Deixe-me saber se isso soa como algo que você gostaria de tentar.

Finalmente, você pode querer converter a saída padronizada para o calendário gregoriano. O que você pode fazer com uma fórmula do Excel executará um cálculo se o valor do ano for menor que 1900 ou algo assim.

Melhor da sorte. Padronizar dados como esse pode ser um pesadelo, embora os scripts e o regex ajudem tremendamente.

    
por 28.11.2017 / 14:33
0

Aqui está uma solução usando o VBA sem o Regex:

Sub GetDateCandidates()
    Dim i As Long, N As Long, s As String
    Dim K As Long, a, bry

    K = 2
    N = Cells(Rows.Count, "A").End(xlUp).Row

    For i = 1 To N
        s = Cells(i, 1).Value
        ary = Split(s, " ")
        For Each a In ary
            bry = Split(a, "-")
            If UBound(bry) = 2 Then
                If (TestBry(bry)) Then
                    Cells(i, K).Value = "'" & a
                    K = K + 1
                End If
            End If
        Next a
        K = 2
    Next i
End Sub

Public Function TestBry(b) As Boolean

    TestBry = False

    If Not IsNumeric(b(0)) Then Exit Function
    If Not IsNumeric(b(1)) Then Exit Function
    If Not IsNumeric(b(2)) Then Exit Function
    If Len(b(0)) > 2 Then Exit Function
    If Len(b(1)) > 2 Then Exit Function
    If Len(b(2)) = 2 Or Len(b(2)) = 4 Then TestBry = True
End Function

As frases estão na coluna A . Cada frase é separada em palavras usando espaços como o separador. Cada palavra é separada em itens usando o traço como um separador. Se:

  1. existem três itens
  2. todos os três itens são numéricos
  3. o comprimento dos dois primeiros itens é 1 ou 2
  4. o comprimento do terceiro item é 2 ou 4

A palavra é armazenada ao lado da frase:

    
por 28.11.2017 / 15:10