C#/.NET字符串操作:如何从文本文件输入中删除注释行?

5

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

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字符串魔法的宇宙中,是否有一种特别“理解”并帮助处理注释的工具。

即使专家的答案是“绝对不行”,那也是一个有用的答案。


2
问题在于每种格式都使用不同的分隔符来表示注释。因此,该方法需要参数化以接受您的注释分隔符类型。在您的示例中,您展示了两个。是否还有其他可能性?还是只有这两个? - Cody Gray
2
注释行的可能性是什么?只能以//或者开头吗?如果是这样,您可以使用类似.Where(line => !line.StartsWith("//") || !line.StartsWith("#"))这样的东西吗? - Soner Gönül
1
另一个重要的问题是,您是否需要支持内联注释,还是我们可以假设注释位于行的开头,并且整行都可以被删除? - Cody Gray
2
lines.Where(l => !l.StartsWith("//")) - Enigmativity
1
你是在问如何将文本解析成行,还是在问如何在获得一堆行后删除注释?(或者两个都需要?) - Culme
显示剩余7条评论
3个回答

9
您可以尝试这样做:

您可以尝试以下步骤:

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);

您可以将原始文件的内容复制到一个没有注释行的临时文件中。然后删除原始文件并将临时文件移动到原始文件位置即可。


4
多行注释会导致此符号出现问题 ^ - Fᴀʀʜᴀɴ Aɴᴀᴍ
2
@FᴀʀʜᴀɴAɴᴀᴍ 我的意思是,这只适用于示例中显示的注释类型。这个问题非常局限,主要是因为对正在处理的文件内容做出了很多假设。根据问题中提供给我们的当前信息量,这个答案在各个方面都是完整的。 - Joshua Shearer
1
这也将删除#region / #endregion指令,这可能是需要的,也可能不是。 - Michael McGriff
2
这不应该是 l => !l.StartsWith("//") && !l.StartsWith("#") 吗?要么就是 l => !(l.StartsWith("//") || l.StartsWith("#"))。一行代码不能同时以 //# 开头。 - Darrel Hoffman
只是提供信息,Darrel,我已经在上面的评论中指出了那个打字错误,这也是我在下面放置答案的原因。 - Fattie
1
我也会考虑在检查的行上调用Trim()或TrimStart(),以去掉行前面的任何空格。 - Kryten

5
希望这能让你明白:
 string[] comments = { "//", "'", "#" };
 var CommentFreeText = File.ReadLines("fileName Here")
                       .Where(X => !comments.Any(Y => X.StartsWith(Y)));

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

并且您可以使用以下方式将其写回:

File.WriteAllLines("path", CommentFreeText);

0

提醒: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);

6
这与已经给出的其他两个答案有何不同? - Joshua Shearer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接