Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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#,如何将文本文件读入字符矩阵,然后查询该矩阵?这可能吗? 例子_C#_Algorithm_Parsing_Text - Fatal编程技术网

使用C#,如何将文本文件读入字符矩阵,然后查询该矩阵?这可能吗? 例子

使用C#,如何将文本文件读入字符矩阵,然后查询该矩阵?这可能吗? 例子,c#,algorithm,parsing,text,C#,Algorithm,Parsing,Text,如果我有一个包含以下行的文本文件: 猫喵喵叫 狗吠叫着 猫跑上了树 我希望最终得到一个由行和列组成的矩阵,如下所示: 0 1 2 3 4 5 6 7 8 9 0| t-h-e- -c-a-t- -m-e-o-w-e-d-.- - - - - - - - 1| t-h-e- -d-o-g- -b-a-r-k-e-d-.- - - - - - - - 2| t-h-e- -c-a-t- -r-a-n- -u-p- -a- -t-r-e-e-.- 然后我想查询这个矩阵,以快速确定有关文本文件

如果我有一个包含以下行的文本文件:

  • 猫喵喵叫
  • 狗吠叫着
  • 猫跑上了树
  • 我希望最终得到一个由行和列组成的矩阵,如下所示:

       0 1 2 3 4 5 6 7 8 9 
    0| t-h-e- -c-a-t- -m-e-o-w-e-d-.- - - - - - - -
    1| t-h-e- -d-o-g- -b-a-r-k-e-d-.- - - - - - - -
    2| t-h-e- -c-a-t- -r-a-n- -u-p- -a- -t-r-e-e-.-
    
    然后我想查询这个矩阵,以快速确定有关文本文件本身的信息。例如,我很快就能判断列“0”中的所有内容是否都是“t”(它是)

    我意识到这似乎是一件奇怪的事情。我试图最终(除其他外)确定各种文本文件是否是固定宽度分隔的,而不需要事先了解该文件。我还想用这个矩阵来检测模式

    实际的文件将通过这是相当大的

    谢谢

    例如,我很快就能判断列“0”中的所有内容是否都是“t”(它是)


    由于还不清楚你到底在哪里遇到了困难,这里有几点建议

    以字符串形式读取文件,每行一个:

    string[] lines = File.ReadAllLines("filename.txt");
    
    从行中获取字符的交错数组(矩阵)(此步骤似乎不必要,因为字符串可以像字符数组一样索引):

    查询示例:列0中的每个字符是否都是“t”:

    bool allTs = charMatrix.All(row => row[0] == 't');
    
    “我试图最终(除其他外)确定各种文本文件是否为固定宽度(…)”

    如果是这样,您可以尝试以下方法:

    public bool isFixedWidth (string fileName)
    {
        string[] lines = File.ReadAllLines(fileName);
    
        int length = lines[0].Length;
        foreach (string s in lines)
        {
            if (s.length != Length)
            {
                return false;
            }
        }
        return true;
    }
    
    public bool CheckIfAllCharactersInAColumnAreTheSame (string[] lines, int colIndex)
    {
        char c = lines[0][colIndex];
        try
        {
            foreach (string s in lines)
            {
                if (s[colIndex] != c)
                {
                    return false;
                }
            }
            return true;
        }
        catch (IndexOutOfRangeException ex)
        {
            return false;
        }
    }
    
    一旦得到
    变量,就可以像在矩阵中一样访问任何字符。Like
    charc=行[3][1]。然而,并不能保证所有的线都是相同的长度。如果你愿意的话,你可以把它们垫得和最长的一样长

    而且

    “如何查询以获取包含所有行的空格字符的所有列的列表(例如)”

    你可以试试这个:

    public bool isFixedWidth (string fileName)
    {
        string[] lines = File.ReadAllLines(fileName);
    
        int length = lines[0].Length;
        foreach (string s in lines)
        {
            if (s.length != Length)
            {
                return false;
            }
        }
        return true;
    }
    
    public bool CheckIfAllCharactersInAColumnAreTheSame (string[] lines, int colIndex)
    {
        char c = lines[0][colIndex];
        try
        {
            foreach (string s in lines)
            {
                if (s[colIndex] != c)
                {
                    return false;
                }
            }
            return true;
        }
        catch (IndexOutOfRangeException ex)
        {
            return false;
        }
    }
    

    你所能做的就是读取文本文件的第一行并将其用作掩码。将下一行与遮罩进行比较,并从遮罩中删除与同一位置的字符不相同的每个字符。在处理所有行之后,您将有一个分隔符列表

    顺便说一句,代码不是很干净,但我认为这是一个很好的开端

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    
    namespace DynamicallyDetectFixedWithDelimiter
    {
        class Program
        {
            static void Main(string[] args)
            {
                var sr = new StreamReader(@"C:\Temp\test.txt");
    
                // Get initial list of delimiters
                char[] firstLine = sr.ReadLine().ToCharArray();
                Dictionary<int, char> delimiters = new Dictionary<int, char>();
                for (int i = 0; i < firstLine.Count(); i++)
                {
                    delimiters.Add(i, firstLine[i]);
                }
    
                // Read subsequent lines, remove delimeters from 
                // the dictionary that are not present in subsequent lines
                string line;
                while ((line = sr.ReadLine()) != null && delimiters.Count() != 0)
                {
                    var subsequentLine = line.ToCharArray();
                    var invalidDelimiters = new List<int>();
    
                    // Compare all chars in first and subsequent line
                    foreach (var delimiter in delimiters)
                    {
                        if (delimiter.Key >= subsequentLine.Count())
                        {
                            invalidDelimiters.Add(delimiter.Key);
                            continue;
                        }
    
                        // Remove delimiter when it differs from the 
                        // character at the same position in a subsequent line
                        if (subsequentLine[delimiter.Key] != delimiter.Value)
                        {
                            invalidDelimiters.Add(delimiter.Key);
                        }
                    }
                    foreach (var invalidDelimiter in invalidDelimiters)
                    {
                        delimiters.Remove(invalidDelimiter);
                    }
                }
    
                foreach (var delimiter in delimiters)
                {
                    Console.WriteLine(String.Format("Delimiter at {0} = {1}", delimiter.Key, delimiter.Value));
                }
    
                sr.Close();
            }
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用System.IO;
    使用System.Linq;
    命名空间DynamicAllyDetectedFixedWithDelimiter
    {
    班级计划
    {
    静态void Main(字符串[]参数)
    {
    var sr=new StreamReader(@“C:\Temp\test.txt”);
    //获取分隔符的初始列表
    char[]firstLine=sr.ReadLine().ToCharArray();
    字典分隔符=新字典();
    对于(int i=0;i=subsequentLine.Count())
    {
    invalidDelimiters.Add(delimiter.Key);
    继续;
    }
    //当分隔符不同于
    //在后续行中位于相同位置的字符
    if(后续行[delimiter.Key]!=delimiter.Value)
    {
    invalidDelimiters.Add(delimiter.Key);
    }
    }
    foreach(invalidDelimiters中的var invalidDelimiter)
    {
    分隔符。删除(invalidDelimiter);
    }
    }
    foreach(分隔符中的var分隔符)
    {
    WriteLine(String.Format(“Delimiter at{0}={1}”、Delimiter.Key、Delimiter.Value));
    }
    高级关闭();
    }
    }
    }
    
    您到底在哪里遇到困难?加载文件?以字符串形式获取内容?将字符串转换为数组?查询数组?
    File.ReadAllLines(“File.txt”).Select(line=>line.tocharray())
    (假设锯齿状数组很好。)我根本不需要创建和查询矩阵,所以我只需要一点入门帮助。谢谢。@MatthewPatrickCashatt“创建并查询矩阵”作为一个问题陈述并没有什么意义。这意味着也许你应该考虑一下你到底想做些什么。“矩阵”是什么意思?创造任何东西都有什么问题?什么样的“查询”?似乎每个
    行的长度都不相同。它将抛出
    索引超出范围
    异常,例如,对于有问题的第[20]行。当然。我只是按照OP描述的示例进行操作,假设每一行在位置0处都有一个字符。对于更一般的算法,需要更多的验证,重点只是为了说明一个简单的例子。很好,干净的解决方案。谢谢谢谢你详尽的回答。我选择了一个不同的答案作为获胜者,只是因为它回答了这个问题是多么直接和优雅,但是你的答案也会帮助一些人+1.