从文本文件中获取给定扩展名的字符串(文件名)
本文关键字:字符串 文件名 扩展名 文件 文本 获取 | 更新日期: 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