web-dev-qa-db-ja.com

パターンのない文字列から日付を抽出する

最近、Oracleデータベースに投稿された一連の説明に依存するExcelシートの作業を開始しました。

文字列は次のようになります

18-8-1438から17-8-1439/15-5-17から4-5-18の期間の駐車場の1年間の家賃

01-08-1438から01-02-1439/28-04-2017から21-10-2017までのストリートの6か月の家賃

310113の1年間の家賃-01-01-1438から30-12-1438の期間のコンセント

説明を投稿する人が快適に感じるその他のフォーム。

ここで私の質問は、Excel関数またはvbaマクロを使用してこれらの説明から日付を簡単に抽出する方法です。ボーナスは、Webサービスを介して日付を変換するのではなく、イスラム暦の日付をその場でグレゴリオ暦に変換できることです。

編集:目的の出力について言及するのを忘れました(Mate Juhaszに感謝)。出力は、mm/dd/yyyyなどのdays360式で使用できるものである必要があります。ほとんどの場合、各エントリには契約開始日と契約終了日の2つの日付があり、同じものがイスラム暦と一緒に投稿される可能性があり、まれにイスラム暦の日付のみになります。通常の投稿形式であるdd/mm/yyyyまたはdd/mm/yyを常に確認してください。

1
Herubrand

1.日付を抽出します

このような場合は RegEx Find/Replace アドインを使用します。これにより、Excelに正規表現機能が追加されます。

配列数式としても使用できます。

  • セルごとに最大4つの日付が予想されるため、連続して4つのセルを選択します(例:例のB3:E3)
  • タイプ式:
    =RegExFind(A3,"\d+-\d+-\d+")
  • ctrl + Shift + Enterを押します
  • 数式をコピーする

これにより、1/2桁の日/月および2/4桁の年として入力されたすべての日付が検索され、パーツは1つの-で区切られます。

2.抽出されたテキストを日付に変換します

グレゴリオ暦でのみ機能するDATEVALUE関数を使用した例では、イスラム暦の経験がありません。

enter image description here

0
Máté Juhász

正規表現なしでVBAを使用するソリューションは次のとおりです。

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

フレーズは列[〜#〜] a [〜#〜]にあります。各フレーズは、区切り文字としてスペースを使用して単語に分割されます。各単語は、ダッシュを区切り文字として使用して項目に分けられます。場合:

  1. 3つのアイテムがあります
  2. 3つの項目はすべて数値です
  3. 最初の2つの項目の長さは、1または2のいずれかです。
  4. 3番目の項目の長さは2または4のいずれかです。

単語はフレーズの横に保存されます:

enter image description here

1
Gary's Student

あなたが与えた例では、それはパターンに従います。

パターンは次のとおりです。少なくとも1桁の数字の後に、ダッシュまたはスラッシュのいずれかの記号が続きます。 (x2)で、2桁または4桁で終わります。そして、それらはすべて同じ行にあります。

したがって、正規表現を使用して、そのようなパターンに一致するすべての結果を返すことができます。私の正規表現は少し錆びていますが、パターンは次のようになります。

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

これは、たとえば、DD/MM/YYYY形式とD-M-YY形式、およびそれらの順列に一致します。

from/to日付形式を解析する場合は、次の検索文字列を使用できます。

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

もちろん、正規表現エンジンを介して実行し、出力を収集する必要があります。

次に、上記の出力を標準化して、すべてがDD/MM/YYYY形式に一致するようにします。ただし、コンピューターのインデックス作成方法を考えると、YYYY-MM-DD検索用のもの。番号をグループ化し、検索と置換で再編成することにより、正規表現でもこれを行うことができます。それがあなたが試してみたいと思う何かのように聞こえるかどうか私に知らせてください。

最後に、標準化された出力をグレゴリオ暦に変換することをお勧めします。その年の値がたとえば1900か何かよりも低い場合は、Excelの数式で計算を実行することでこれを行うことができます。

幸運を祈ります。このようなデータの標準化は悪夢になる可能性がありますが、スクリプトと正規表現は非常に役立ちます。

0
Christian