You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何读取目录文件并筛选含多个指定字符串的行写入外部文件

这个问题很常见——string.Contains()方法本身只支持单个匹配字符串,所以你直接传多个参数肯定会编译失败。下面给你几种靠谱的实现方式,分两种场景来对应你的需求:

场景1:最后一段完全等于目标字符串中的任意一个

如果你的需求是分号分割后的最后部分必须是Test1、Test2或Test3(完全匹配),可以用集合来存储目标值,HashSet的查找效率比普通列表更高:

// 定义要匹配的目标集合
var targetMatches = new HashSet<string> { "Test1", "Test2", "Test3" };

foreach (string line in File.ReadAllLines(pendingFile)
    .Where(line => targetMatches.Contains(line.Split(';').Last())))
{
    File.AppendAllText(path, line + Environment.NewLine);
}

场景2:最后一段包含目标字符串中的任意一个(和原代码逻辑一致,扩展多匹配)

如果是要最后一段里包含任意一个目标子串(比如最后一段是XxxTest1Yyy也能匹配),就需要用Enumerable.Any()遍历目标集合,检查是否有匹配项:

var targetSubstrings = new[] { "Test1", "Test2", "Test3" };

foreach (string line in File.ReadAllLines(pendingFile)
    .Where(line => 
    {
        // 提取分号分割后的最后部分,避免重复计算
        var lastSegment = line.Split(';').Last();
        // 检查是否有任意一个目标子串存在于lastSegment中
        return targetSubstrings.Any(sub => lastSegment.Contains(sub));
    }))
{
    File.AppendAllText(path, line + Environment.NewLine);
}

额外优化:大文件场景下的性能提升

如果你的待处理文件很大,File.ReadAllLines()会把所有行一次性加载到内存,可能造成内存压力。换成File.ReadLines()(流式读取、逐行处理),同时用StreamWriter代替File.AppendAllText()(避免每次写入都打开/关闭文件),性能会好很多:

var targetSubstrings = new[] { "Test1", "Test2", "Test3" };

// 使用using确保StreamWriter自动释放资源
using (var outputWriter = new StreamWriter(path, append: true))
{
    foreach (string line in File.ReadLines(pendingFile)
        .Where(line => 
        {
            var lastSegment = line.Split(';').Last();
            return targetSubstrings.Any(sub => lastSegment.Contains(sub));
        }))
    {
        outputWriter.WriteLine(line);
    }
}

内容的提问来源于stack exchange,提问作者cragjungle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 21:24:09