C#/ .net字符串魔术从文本文件输入中删除注释行?

时间:2016-01-21 14:15:23

标签: c# .net string linq

假设您有一个长文字读取的文本文件:

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字符串魔法世界中是否有一些功能,特别“理解”并帮助评论

即使专家的答案“绝对没有”,这也是一个有用的答案。

3 个答案:

答案 0 :(得分:8)

您可以尝试这样:

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

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

答案 1 :(得分:5)

希望这有意义:

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

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

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

File.WriteAllLines("path", CommentFreeText);

答案 2 :(得分:0)

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