メインコンテンツへスキップ
見出し画像

フルパスからファイル名を取り出す方法:TEXTAFTERがない環境でもOK

    こんにちは。スーパーソフトウエア東京オフィス 技術部の加藤です。ソフトウェア開発の現場では、ログファイルや出力データを扱う際に、「フルパスからファイル名だけを取り出したい」という場面がよくあります。例えば、次のようなパスが並んでいたとします。

    画像

    欲しいのは、この中の idal9hz5g.log や mkgjapjb.log といった「ファイル名だけ」です。


    1. Pythonで取り出す方法

    Pythonにはファイルパス操作用の便利なモジュールが用意されています。例えば、Excelファイル(.xlsx)に記録されたパスからファイル名だけを抽出する場合は次のように書けます。

    import os
    import openpyxl
    
    # Excelファイルを開く
    wb = openpyxl.load_workbook("input.xlsx")
    ws = wb.active  # 最初のシートを対象
    
    # A1~A5 のセルを順に処理
    for row in range(1, 6):  # 1~5 行目
        path = ws[f"A{row}"].value
        if path:  # None でない場合
            # ファイル名だけ抽出
            filename = os.path.basename(path)
            # B列に書き込み
            ws[f"B{row}"] = filename
    
    # 保存(上書き保存)
    wb.save("input.xlsx")
    • ポイント: os.path.basename でフルパスからファイル名だけを簡単に取得できます。 

    from pathlib import Path
    import openpyxl
    
    # Excelファイルを開く
    wb = openpyxl.load_workbook("input.xlsx")
    ws = wb.active  # 最初のシートを対象
    
    # A列のセルを順に処理(最終行まで)
    for row in range(1, ws.max_row + 1):
        path_str = ws[f"A{row}"].value
        if path_str:
            # Pathオブジェクトを作成してファイル名だけ取得
            filename = Path(path_str).name
            ws[f"B{row}"] = filename  # B列に書き込み
    
    # 保存
    wb.save("input.xlsx")

    pathlibを使うと、Python でフルパスからファイル名だけを取得する方法がさらに直感的になります。os.path.basename よりモダンで読みやすい書き方です。

    結果

    画像

    2. Excelで取り出す方法

    Excelでも、関数やVBAを使って同じことができます。

    (a) VBAの場合

    Sub ExtractFileNames()
        Dim i As Long
        Dim lastRow As Long
        Dim fullPath As String
        
        ' A列の最終行を取得
        lastRow = Cells(Rows.Count, "A").End(xlUp).Row
        
        ' A1~最終行まで処理
        For i = 1 To lastRow
            fullPath = Cells(i, 1).Value
            If fullPath <> "" Then
                ' ファイル名だけ抽出してB列に出力
                Cells(i, 2).Value = Mid(fullPath, InStrRev(fullPath, "\") + 1)
            End If
        Next i
    End Sub
    ただし、使える関数はバージョンによって異なります。

    (b) Excel関数の場合

    • Excel 365 / 2021 以降
      新しい関数 TEXTAFTER を使えば一発です。

    =TEXTAFTER(A1, "\", -1)
    • Excel 2019 以前
      TEXTAFTER が使えない場合は、SUBSTITUTE と FIND、RIGHT を組み合わせます。

    =RIGHT(A1, LEN(A1) - FIND("~", SUBSTITUTE(A1, "\", "~", LEN(A1)-LEN(SUBSTITUTE(A1, "\", "")))))

    ぱっと見た限り、直観的に理解できないので、Excel 2019以前でファイル名を抽出する関数の詳細ステップを解説します。


    ステップ1:パス内の「\」の個数を数える

    LEN(A1) - LEN(SUBSTITUTE(A1, "\", ""))
    
    • SUBSTITUTE(A1, "\", "")
      → 文字列から「\」をすべて削除します。

    • LEN(A1) と LEN(削除後) の差
      → 元の文字列に含まれる「\」の個数が分かります。

    例: このパスでは「\」が 6 個なので、結果は 6です。


    ステップ2:最後の「\」だけを置き換える

    SUBSTITUTE(A1, "\", "~", LEN(A1)-LEN(SUBSTITUTE(A1, "\", "")))
    
    • SUBSTITUTE の第4引数に「置換対象の出現番号」を指定できます。

    • ここでは「最後の \」だけを ~ に置き換えます。
      「~」自体に特別な意味があるわけではありません。 ポイントは『パスに含まれない文字を一時的に置き換えに使う』 ことです。

    • 結果の文字列は次の通りです。

    C:\Users\katoy\test1\test2\qfkyzop5~idal9hz5g.log
    

    ステップ3:最後の「\」の位置を取得

    FIND("~", SUBSTITUTE(...))
    • 先ほど「最後の \」を置き換えた「~」の位置を調べます。

    • 文字列の何文字目かが分かります。

    • この例では位置は 35(例)となります。


    ステップ4:右側の文字列を取り出す

    RIGHT(A1, LEN(A1) - FIND("~", ...))
    • 全体の長さから「~」までの文字列の長さを引きます。

    • 右からその文字数だけ切り出します。

    • これでファイル名だけを取得可能できます。

    結果:

    idal9hz5g.log

    まとめ

    • Python → os.path.basename または pathlib.Path.name で簡単に取得可能

    • Excel 365/2021 → TEXTAFTER / TEXTBEFORE を使用

    • Excel 2019以前 → SUBSTITUTE + FIND + RIGHT の組み合わせで対応

    新しい関数を使える環境ではとても簡単ですが、古い環境では工夫して処理する必要があります。こうした「Excel職人技」も現場ではよく使われています。


    ▼採用情報

    ▼新卒情報はWantedlyで

     
     
    スーパーソフトウエア東京オフィスのエンジニアが発信する技術ブログです。 スーパーソフトウエアは「テクノロジーで世界を革新する」というミッションのもと、40年に渡りIT技術を追求しているプロ技術者集団です。

    あなたへのおすすめ