C#/.NET 字符串魔术,用于从文本文件输入中删除注释行

本文关键字:输入 文件 删除 注释 文本 NET 字符串 魔术 用于 | 更新日期: 2023-09-27 18:31:23

假设你有一个文本文件,你读入了一个长字符串:

123 123 123
123 123 123
// Just a comment
123 123 123    
123 123 123
# Just a comment
123 123 123

您通常将其拆分为如下所示的行(Unity3D 中的示例),

    List<string> lines = new List<string>(
        controlFile.text.Split(new string[] { "'r","'n" }, 
        StringSplitOptions.RemoveEmptyEntries));

.NET 提供了大量的字符串魔术,例如格式设置等。

我想知道,是否有一些可用的魔法可以轻松删除评论?

注意 - 当然可以使用正则表达式等来做到这一点。正如SonerGönül指出的那样,它可以通过.Where.StartsWith

我的问题是,在.NET字符串魔术的宇宙中是否有一些工具,它专门"理解"并帮助注释

即使专家的答案是"绝对否定",这也是一个有用的答案。

C#/.NET 字符串魔术,用于从文本文件输入中删除注释行

你可以

这样尝试:

var t= Path.GetTempFileName();
var l= File.ReadLines(fileName).Where(l => !l.StartsWith("//") || !l.StartsWith("#"));
File.WriteAllLines(t, l);
File.Delete(fileName);
File.Move(t, fileName);

因此,您基本上可以将原始文件的内容复制到没有注释行的临时文件中。然后删除该文件并将临时文件移动到原始文件。

希望这是有意义的:

 string[] comments = { "//", "'", "#" };
 var CommentFreeText = File.ReadLines("fileName Here")
                       .Where(X => !comments.Any(Y => X.StartsWith(Y)));

您可以使用要从文本文件中删除的注释符号填充comments[]。在阅读文本时,它将消除以任何注释符号开头的所有行。

您可以使用以下方法将其写回:

File.WriteAllLines("path", CommentFreeText);

仅供参考,Rahul基于SonerGönül的答案是错误的,代码有一个错误并且不起作用。

为了节省任何人打字,这里有一个功能/测试的答案,它只使用匹配。

关于手头的问题,似乎没有任何专门内置于.Net的东西可以"理解"文本中的典型注释。你只需要像这样使用匹配从头开始编写它......

// ExtensionsSystem.cs, your handy system-like extensions
using UnityEngine;
using System.Collections.Generic;
using System;
using System.Text.RegularExpressions;
using System.Linq;
public static class ExtensionsSystem
    {
    public static List<string> CleanLines(this string stringFromFile)
        {
        List<string> result = new List<string>(
            stringFromFile
            .Split(new string[] { "'r","'n" },
                StringSplitOptions.RemoveEmptyEntries)
            );
        result = result
            .Where(line => !(line.StartsWith("//")
                            || line.StartsWith("#")))
            .ToList();
        return result;
        }
    }

然后你会

List<string> lines = controlFile.text.CleanLines();
foreach (string ln in lines) Debug.Log(ln);