Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带Lambda表达式的正则表达式_C#_Regex_Lambda - Fatal编程技术网

C# 带Lambda表达式的正则表达式

C# 带Lambda表达式的正则表达式,c#,regex,lambda,C#,Regex,Lambda,我有几个文本文件应该用制表符分隔,但实际上是由任意数量的空格分隔的。我想将文本文件中的行解析为数据表(文本文件的第一行有属性名称的标题)。这促使我考虑构建一种可扩展的、简单的文本文件解析方法。以下是我目前的工作解决方案: string filePath = @"C:\path\lowbirthweight.txt"; //regex to remove multiple spaces Regex regex = new Regex(@"[ ]{2,

我有几个文本文件应该用制表符分隔,但实际上是由任意数量的空格分隔的。我想将文本文件中的行解析为
数据表
(文本文件的第一行有属性名称的标题)。这促使我考虑构建一种可扩展的、简单的文本文件解析方法。以下是我目前的工作解决方案:

string filePath = @"C:\path\lowbirthweight.txt";
            //regex to remove multiple spaces
            Regex regex = new Regex(@"[ ]{2,}", RegexOptions.Compiled);
            DataTable table = new DataTable();
            var reader = ReadTextFile(filePath); 
            //headers in first row
            var headers = reader.First();
            //skip headers for data
            var data = reader.Skip(1).ToArray();
            //remove arbitrary spacing between column headers and table data
            headers = regex.Replace(headers, @" ");
            for (int i = 0; i < data.Length; i++)
            {
                data[i] = regex.Replace(data[i], @" ");
            }
            //make ready the DataTable, split resultant space-delimited string into array for column names
            foreach (string columnName in headers.Split(' '))
            {
                table.Columns.Add(new DataColumn() { ColumnName = columnName });
            }
            foreach (var record in data)
            {
                //split into array for row values
                table.Rows.Add(record.Split(' '));
            }
            //test prints correctly to the console
            Console.WriteLine(table.Rows[0][2]);
        }
        static IEnumerable<string> ReadTextFile(string fileName)
        {
            using (var reader = new StreamReader(fileName))
            {
                while (!reader.EndOfStream)
                {
                    yield return reader.ReadLine();
                }
            }
        }

我不太关心性能,只是想看看这样的东西是如何工作的

您应该咨询您的数据源,找出数据不好的原因

对于您试图实现的API设计:

public class RegexCollection
{
    private readonly Regex _allowOneSpace = new Regex(" ");

    public Regex AllowOneSpace { get { return _allowOneSpace; } }
}

public static class RegexExtensions
{
    public static IEnumerable<string[]> SmartRegex(
        this IEnumerable<string> collection,
        Func<RegexCollection, Regex> selector
    )
    {
        var regexCollection = new RegexCollection();
        var regex = selector(regexCollection);
        return collection.Select(l => regex.Split(l));
    }
}
公共类RegexCollection
{
private readonly Regex_allowOneSpace=new Regex(“”);
公共正则表达式AllowOneSpace{get{return\u AllowOneSpace;}
}
公共静态类RegexExtensions
{
公共静态IEnumerable SmartRegex(
这是数不清的收藏,
函数选择器
)
{
var regexCollection=新的regexCollection();
var regex=选择器(regexCollection);
return collection.Select(l=>regex.Split(l));
}
}
用法:

var items = new List<string> { "Hello world", "Goodbye world" };

var results = items.SmartRegex(x => x.AllowOneSpace);
var items=新列表{“你好世界”,“再见世界”};
var results=items.SmartRegex(x=>x.AllowOneSpace);

这段代码看起来不易扩展。我知道为什么数据源不好,不幸的是,这不是可以修复的。所以:)你能解释一下这段代码吗?我不理解最后两行代码。最后两行是哪一行?你知道LINQ
Select
做什么吗?是的,但我没有看到足够多的内容来完全理解不是
x=>x.SomeMethod
的LINQ语法。我不太熟悉创建自己的代理。
var items = new List<string> { "Hello world", "Goodbye world" };

var results = items.SmartRegex(x => x.AllowOneSpace);