使用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;
}
}
一旦得到行
变量,就可以像在矩阵中一样访问任何字符。Likecharc=行[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.