2

次のパターンに従うファイルパスがあります。

Some\File\Path\Base\yyyy\MM\dd\HH\mm\Random8.3

2012 年以降のすべてを抽出したいのですが、問題は、右側が標準である一方で、レコードごとにベース ディレクトリが異なる可能性があることです。

以下に 2 つの例を示します。

  1. C:\Temp\X\2012\08\27\18\35\wy32dm1q.qyt
    戻り値:2012\08\27\18\35\wy32dm1q.qyt

  2. D:\Temp\X\Y\2012\08\27\18\36\tx84uwvr.puq
    戻り値:2012\08\27\18\36\tx84uwvr.puq

現在LastIndexOf(Path.DirectorySeparatorChar)、2012 年の直前に文字列のインデックスを取得するために N 回取得し、そのインデックスから部分文字列を取得しています。しかし、もっと良い方法があるのではないかと感じています。

4

4 に答える 4

4
    static void Main(string[] args)
    {
        Console.WriteLine(GetLastParts(@"D:\Temp\X\Y\2012\08\27\18\36\tx84uwvr.puq", @"\", 6));
        Console.ReadLine();
    }

    static string GetLastParts(string text, string separator, int count)
    {
        string[] parts = text.Split(new string[] { separator }, StringSplitOptions.None);
        return string.Join(separator, parts.Skip(parts.Count() - count).Take(count).ToArray());
    }
于 2012-08-30T15:18:18.307 に答える
3

探している形式に常に\yyyy\ MM \ dd \ HH \ mmが含まれていると仮定して、正規表現を使用するソリューションを次に示します。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(ExtractPath(@"C:\Temp\X\2012\08\27\18\35\wy32dm1q.qyt"));
        Console.WriteLine(ExtractPath(@"D:\Temp\X\Y\2012\08\27\18\36\tx84uwvr.puq"));
    }

    static string ExtractPath(string fullPath)
    {
        string regexconvention = String.Format(@"\d{{4}}\u{0:X4}(\d{{2}}\u{0:X4}){{4}}\w{{8}}.\w{{3}}", Convert.ToInt32(Path.DirectorySeparatorChar, CultureInfo.InvariantCulture));

        return Regex.Match(fullPath, regexconvention).Value;
    }
}
于 2012-08-30T15:29:08.803 に答える
0

あなたの現在のアプローチに問題はないと思います。それはおそらく仕事に最適です。

public string GetFilepath(int nth, string needle, string haystack) {
    int lastindex = haystack.Length;

    for (int i=nth; i>=0; i--)
        lastindex = haystack.LastIndexOf(needle, lastindex-1);

    return haystack.Substring(lastindex);
}

シンプルにしておきます(KISS)。デバッグ/保守が簡単で、おそらく正規表現バリアントの2倍の速度です。

于 2012-08-30T15:29:42.127 に答える
0

C#ソリューションは次のようになります

string str = @"C:\Temp\X\2012\08\27\18\35\wy32dm1q.qyt";
string[] arr=str.Substring(str.IndexOf("2012")).Split(new char[]{'\\'});
于 2012-08-30T15:14:52.893 に答える