从文本文件中获取给定扩展名的字符串(文件名)

本文关键字:字符串 文件名 扩展名 文件 文本 获取 | 更新日期: 2023-09-27 17:56:08

如果问题标题有点混乱,我深表歉意,但假设一个文本文件包含以下数据:

Sample         'Line1
 1             'Line2
 2             'ProjectCount
FileA.ext      'Projects( 1)
 0             'SortTermCount
FileB.ext      'Projects( 2)
 0             'SortTermCount
 ...

我知道扩展名在文件中以字符串形式存在(即.doc),我想做的是获取文件的全名和扩展名,代码将返回"FileA.ext"和"FileB.ext"(作为字符串,或数组(最好),或其他什么)。

我试图修改这个SO问题中的代码:https://stackoverflow.com/a/3152180 使用文本文件,但我想这仅适用于目录。

编辑:"ProjectCount"之前的值告诉我可以期待多少扩展文件,所以也许我不需要搜索整个文件?

从文本文件中获取给定扩展名的字符串(文件名)

如果您知道可以显示的扩展,则可以将以下解决方案与正则表达式一起使用:

//regex for file name with known extensions    
Regex r = new Regex("^.*''.(ext|doc|PUT_OTHER_EXTENSIONS_HERE)$");
var lines = File.ReadAllLines(FILE_PATH);
var res = lines.Where(x => !string.IsNullOrWhiteSpace(x) && r.Match(GetFirstEntry(x)).Success)
                    .Select(x => GetFirstEntry(x));

其中 获取第一条目 :

            /// <summary>
            /// Splits the string by the "'" char and gets the first entry.
            /// </summary>
            /// <param name="x"></param>
            /// <returns></returns>
            private static string GetFirstEntry(string x)
            {
             try{
                return x.Split(new string[] { "'" }, StringSplitOptions.RemoveEmptyEntries)[0].Trim();
                }catch{return string.Empty;}
            }
你可以

这样做:

var fileName = @"C:'source.txt";
var files = File
    .ReadAllLines(fileName)
    .Where(line => !line.StartsWith(" "))
    .Skip(1) //Ignore the first line
    .Select(line => line.Substring(0, line.IndexOf(" ")));

现在files包含一个包含所有文件名的IEnumerable<string>

因此,您可以像这样遍历文件名:

foreach(string fileName in files)
{
    //fileName is a string variable
}

你可以做:

  • 使用 File.ReadLines 逐行读取每个文件,而不是将所有内容加载到内存中
  • 拆分空格字符上的每一行
  • 考虑拆分的第一列作为可能的文件名
  • 使用Path.GetExtension方法获取文件的扩展名
  • 将其与您的extensionToCheck与忽略大小写进行比较
  • 选择匹配的那些

喜欢:

string extensionToCheck = ".ext";
string filePath = @"test.txt";
var fileNames = File.ReadLines(filePath)
    .Select(line => new {PossibleFile = line.Split().First()})
    .Where(p =>
        Path.GetExtension(p.PossibleFile)
            .Equals(extensionToCheck, StringComparison.InvariantCultureIgnoreCase))
    .Select(f => f.PossibleFile);

对于输出使用:

foreach (var fileName in fileNames)
{
    Console.WriteLine(fileNames);
}

在上述示例文件中,您将获得两条记录

FileA.ext
FileB.ext